我们在git中使用标签作为部署过程的一部分。有时,我们希望通过从远程存储库中删除这些标记来清理它们。
这很简单。一个用户在一组命令中删除了本地标签和远程标签。我们有一个结合了这两个步骤的shell脚本。
第二个(第3个,第4个,……)用户现在拥有不再反映在远程上的本地标记。
我正在寻找一个类似于git远程修剪起源的命令,清理本地跟踪分支,其中远程分支已被删除。
或者,可以使用一个简单的命令来列出远程标记,与通过git tag -l返回的本地标记进行比较。
我们在git中使用标签作为部署过程的一部分。有时,我们希望通过从远程存储库中删除这些标记来清理它们。
这很简单。一个用户在一组命令中删除了本地标签和远程标签。我们有一个结合了这两个步骤的shell脚本。
第二个(第3个,第4个,……)用户现在拥有不再反映在远程上的本地标记。
我正在寻找一个类似于git远程修剪起源的命令,清理本地跟踪分支,其中远程分支已被删除。
或者,可以使用一个简单的命令来列出远程标记,与通过git tag -l返回的本地标记进行比较。
当前回答
刚刚在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)
其他回答
更新@2021/05
将$REPO参数传递给自定义脚本。
sync_git_tags.sh的内容
#!/bin/sh
# cd to $REPO directory
cd $1
pwd
# sync remote tags
git tag -l | xargs git tag -d && git fetch -t
Old
ps:更新@2021/05,git获取-修剪-修剪标签来源不工作在我的MacOS。
我将该命令作为MacOS上的自定义操作添加到SourceTree。 通过Sourcetree -> Preferences设置自定义操作…->自定义动作
我使用git fetch -prune- prune-tags origin来同步标签从远程到本地。
与@Richard W的答案相同,但适用于Windows (PowerShell)
git tag | ForEach-Object -Process { git tag -d $_ }
git fetch -t
显示本地和远程标签之间的区别:
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 fetch --prune --prune-tags # or just git fetch -p -P
是的,它现在是一个获取的选项。
如果你不想获取,只需修剪:
git remote prune origin
在新的git版本(如v2.26.2或更高版本)中,您可以使用——prune-tags
- p ——prune-tags 在获取之前,如果启用了——prune,则删除远程上不再存在的任何本地标记。这个选项应该更谨慎地使用,不像——prune它将删除已经创建的任何本地引用(本地标记)。这个选项是提供显式标记refspec和——prune的简写,请参阅其文档中关于它的讨论。
所以你需要运行:
git fetch origin --prune --prune-tags