刪除再也不在遠程存儲庫中的本地git標籤

在部署過程當中,咱們在git中使用標籤。 咱們不時但願經過從遠程存儲庫中刪除它們來清理這些標記。 git

這很簡單。 一個用戶在一組命令中刪除本地標籤和遠程標籤。 咱們有一個結合了兩個步驟的小shell腳本。 shell

如今,第二(第三,第四,...)用戶具備再也不反映在遙控器上的本地標籤。 bash

我正在尋找相似於git remote prune origin的命令,該命令將清除已刪除遠程分支的本地跟蹤分支。 fetch

或者,可使用一個簡單的列出遠程標籤的命令來與經過git tag -l返回的本地標籤進行比較。 spa


#1樓

從Git v1.7.8到v1.8.5.6,您可使用如下命令: code

git fetch <remote> --prune --tags

更新資料

因爲提交e66ef7ae6f31f2,這在較新版本的git(從v1.9.0開始)上不起做用 。 我真的不想刪除它,由於它確實對某些人有用。 排序

正如「 Chad Juliano」建議的那樣,從v1.7.8開始,全部Git版本均可以使用如下命令: rem

git fetch --prune <remote> +refs/tags/*:refs/tags/*

您可能須要在標籤部分加上引號(例如在Windows上),以免通配符擴展: 部署

git fetch --prune <remote> "+refs/tags/*:refs/tags/*"

#2樓

好問題。 :)我沒有完整的答案... get

也就是說,您能夠經過git ls-remote獲取遠程標籤列表。 要列出由origin引用的存儲庫中的標記,請運行:

git ls-remote --tags origin

這將返回哈希和友好標記名稱的列表,例如:

94bf6de8315d9a7b22385e86e1f5add9183bcb3c        refs/tags/v0.1.3
cc047da6604bdd9a0e5ecbba3375ba6f09eed09d        refs/tags/v0.1.4
...
2f2e45bedf67dedb8d1dc0d02612345ee5c893f2        refs/tags/v0.5.4

固然,您能夠將bash腳本放在一塊兒,以比較此列表生成的標籤與本地標籤。 看一下git show-ref --tags ,它以與git ls-remote相同的形式生成標籤名稱。


git show-ref一句, git show-ref的選項與您想要的相反。 如下命令將列出您在本地沒有的遠程分支上的全部標籤:

git ls-remote --tags origin | git show-ref --tags --exclude-existing

#3樓

怎麼樣-刪除全部本地標籤,而後從新獲取? 考慮到您的回購可能包含子模塊:

git submodule foreach --recursive  'git tag | xargs git tag -d'
(alternatively, "for i in `find .git  -type d -name '*tags*'`; do rm -f $i/*;  done")
git fetch -t
git submodule foreach --recursive git fetch -t

#4樓

若是隻但願遙控器上存在的那些標籤,只需刪除全部本地標籤:

$ git tag -d $(git tag)

而後獲取全部遠程標記:

$ git fetch --tags

#5樓

顯示本地和遠程標籤之間的區別:

diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort)
  • git tag給出本地標籤列表
  • git ls-remote --tags給出遠程標籤的完整路徑列表
  • cut -f2 | grep -v '\\^' | sed 's#refs/tags/##' cut -f2 | grep -v '\\^' | sed 's#refs/tags/##'僅從遠程標記路徑列表中解析出標記名稱
  • 最後,咱們對兩個列表中的每一個列表進行排序並進行比較

以「 <」開頭的行是您的本地標籤,再也不位於遠程倉庫中。 若是數量不多,則能夠手動將它們手動刪除,若是數量不少,則能夠執行更多重複操做和管道操做以使其自動化。

相關文章
相關標籤/搜索