删除远程存储库上不再存在的本地git标签

我们在git中使用标签作为部署过程的一部分。 有时,我们希望通过从远程存储库中删除这些标签来清理这些标签。

这非常简单。 一个用户在一组命令中删除本地标签和远程标签。 我们有一个结合了两个步骤的小脚本脚本。

第二(第三,第四,...)用户现在具有不再反映在遥控器上的本地标签。

我正在寻找一个类似于git remote prune origin的命令,该命令清理本地跟踪远程分支已被删除的分支。

或者,可以使用简单的列出远程标签的命令来比较通过git tag -l返回的本地标签。


好问题。 :)我没有一个完整的答案...

也就是说,你可以通过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 ls-remote --tags origin | git show-ref --tags --exclude-existing

这是一个很好的问题,我一直在想同样的事情。

我不想写一个脚本,所以寻求不同的解决方案。 关键是发现你可以在本地删除一个标签,然后使用git fetch从远程服务器“取回”。 如果标签在遥控器上不存在,则它将保持被删除。

因此,您需要按顺序键入两行:

git tag -l | xargs git tag -d
git fetch --tags

这些:

  • 删除本地仓库中的所有标签。 FWIW,xargs将“tag -l”的每个标签输出放在“tag -d”的命令行上。 没有这个,git不会删除任何东西,因为它不读取标准输入(愚蠢的git)。

  • 从远程仓库获取所有有效标签。

  • 这甚至可以在Windows上工作。


    从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/*"
    
    链接地址: http://www.djcxy.com/p/92399.html

    上一篇: Remove local git tags that are no longer on the remote repository

    下一篇: Retrieve a single file from a repository