我们在git中使用标签作为部署过程的一部分。有时,我们希望通过从远程存储库中删除这些标记来清理它们。
这很简单。一个用户在一组命令中删除了本地标签和远程标签。我们有一个结合了这两个步骤的shell脚本。
第二个(第3个,第4个,……)用户现在拥有不再反映在远程上的本地标记。
我正在寻找一个类似于git远程修剪起源的命令,清理本地跟踪分支,其中远程分支已被删除。
或者,可以使用一个简单的命令来列出远程标记,与通过git tag -l返回的本地标记进行比较。
我们在git中使用标签作为部署过程的一部分。有时,我们希望通过从远程存储库中删除这些标记来清理它们。
这很简单。一个用户在一组命令中删除了本地标签和远程标签。我们有一个结合了这两个步骤的shell脚本。
第二个(第3个,第4个,……)用户现在拥有不再反映在远程上的本地标记。
我正在寻找一个类似于git远程修剪起源的命令,清理本地跟踪分支,其中远程分支已被删除。
或者,可以使用一个简单的命令来列出远程标记,与通过git tag -l返回的本地标记进行比较。
当前回答
如果你只想要那些存在于远程的标签,只需删除所有本地标签:
$ git tag -d $(git tag)
然后获取所有远程标签:
$ git fetch --tags
其他回答
这样如何-删除所有本地标签,然后重新获取? 考虑到你的repo可能包含子模块:
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
好问题。我没有一个完整的答案…
也就是说,您可以通过git ls-remote获得远程标记列表。要列出存储库中根据来源引用的标记,您可以运行:
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 ls-remote --tags origin | git show-ref --tags --exclude-existing
如果你只想要那些存在于远程的标签,只需删除所有本地标签:
$ git tag -d $(git tag)
然后获取所有远程标签:
$ git fetch --tags
显示本地和远程标签之间的区别:
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort)
标记给出了本地标记的列表 Git ls-remote——tags给出了远程标记的完整路径列表 Cut -f2 | grep -v '\^' | sed 's#refs/tags/##'只从远程标签路径列表中解析出标签名 最后,我们对这两个表分别进行排序和区分
以“<”开头的行是不再在远程repo中的本地标记。如果它们很少,您可以逐个手动删除它们,如果它们很多,您可以做更多的grep-ing和管道来自动化。
从Git v1.7.8到v1.8.5.6,你可以这样使用:
git fetch <remote> --prune --tags
更新
这在较新的git版本(从v1.9.0开始)上不起作用,因为提交了e66ef7ae6f31f2。我并不想删除它,因为它确实对一些人有用。
根据“Chad Juliano”的建议,对于v1.7.8以来的所有Git版本,您可以使用以下命令:
git fetch --prune <remote> +refs/tags/*:refs/tags/*
你可能需要用引号将标签部分括起来(例如在Windows上),以避免通配符展开:
git fetch --prune <remote> "+refs/tags/*:refs/tags/*"
注意:在所有这些情况下,可能是“origin”或任何您通常引用的远程。