在部署过程当中,咱们在git中使用标签。 咱们不时但愿经过从远程存储库中删除它们来清理这些标记。 git
这很简单。 一个用户在一组命令中删除本地标签和远程标签。 咱们有一个结合了两个步骤的小shell脚本。 shell
如今,第二(第三,第四,...)用户具备再也不反映在遥控器上的本地标签。 bash
我正在寻找相似于git remote prune origin
的命令,该命令将清除已删除远程分支的本地跟踪分支。 fetch
或者,可使用一个简单的列出远程标签的命令来与经过git tag -l
返回的本地标签进行比较。 spa
从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/*"
好问题。 :)我没有完整的答案... 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
怎么样-删除全部本地标签,而后从新获取? 考虑到您的回购可能包含子模块:
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 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 tag
给出本地标签列表 git ls-remote --tags
给出远程标签的完整路径列表 cut -f2 | grep -v '\\^' | sed 's#refs/tags/##'
cut -f2 | grep -v '\\^' | sed 's#refs/tags/##'
仅从远程标记路径列表中解析出标记名称 以“ <”开头的行是您的本地标签,再也不位于远程仓库中。 若是数量不多,则能够手动将它们手动删除,若是数量不少,则能够执行更多重复操做和管道操做以使其自动化。