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

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

第二个(第3个,第4个,……)用户现在拥有不再反映在远程上的本地标记。

我正在寻找一个类似于git远程修剪起源的命令,清理本地跟踪分支,其中远程分支已被删除。

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


当前回答

在新的git版本(如v2.26.2或更高版本)中,您可以使用——prune-tags

- p ——prune-tags 在获取之前,如果启用了——prune,则删除远程上不再存在的任何本地标记。这个选项应该更谨慎地使用,不像——prune它将删除已经创建的任何本地引用(本地标记)。这个选项是提供显式标记refspec和——prune的简写,请参阅其文档中关于它的讨论。

所以你需要运行:

git fetch origin --prune --prune-tags

其他回答

刚刚在GitHub上的pivotal_git_scripts Gem fork中添加了git sync-local-tags命令:

https://github.com/kigster/git_scripts

安装gem,然后在存储库中运行"git sync-local-tags"来删除远程服务器上不存在的本地标记。

或者你也可以安装下面这个脚本,并将其命名为"git-sync-local-tags":


#!/usr/bin/env ruby

# Delete tags from the local Git repository, which are not found on 
# a remote origin
#
# Usage: git sync-local-tags [-n]
#        if -n is passed, just print the tag to be deleted, but do not 
#        actually delete it.
#
# Author: Konstantin Gredeskoul (http://tektastic.com)
#
#######################################################################

class TagSynchronizer
  def self.local_tags
    `git show-ref --tags | awk '{print $2}'`.split(/\n/)
  end

  def self.remote_tags
    `git ls-remote --tags origin | awk '{print $2}'`.split(/\n/)
  end

  def self.orphaned_tags
    self.local_tags - self.remote_tags
  end

  def self.remove_unused_tags(print_only = false)
    self.orphaned_tags.each do |ref|
      tag = ref.gsub /refs\/tags\//, ''
      puts "deleting local tag #{tag}"
      `git tag -d #{tag}` unless print_only
    end
  end
end

unless File.exists?(".git")
  puts "This doesn't look like a git repository."
  exit 1
end

print_only = ARGV.include?("-n")
TagSynchronizer.remove_unused_tags(print_only)

Git本身支持清除本地标记

git fetch --tags --prune-tags

该命令提取最新的标记并删除所有已删除的标记

好问题。我没有一个完整的答案…

也就是说,您可以通过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

TortoiseGit现在可以比较标签了。

左边是远程日志,右边是本地日志。

使用同步对话框的比较标签功能:

另见TortoiseGit 2973期

与@Richard W的答案相同,但适用于Windows (PowerShell)

git tag | ForEach-Object -Process { git tag -d $_ }
git fetch -t