在部署过程中,我们在git中使用标签。我们不时希望通过从远程存储库中删除它们来清理这些标记。
这很简单。一个用户在一组命令中删除本地标签和远程标签。我们有一个结合了两个步骤的小shell脚本。
现在,第二(第三,第四,...)用户具有不再反映在遥控器上的本地标签。
我正在寻找与git remote prune origin
清除本地跟踪分支(已删除远程分支)的命令类似的命令。
或者,可以使用列出远程标签的简单命令与通过传回的本地标签进行比较git tag -l
。
在部署过程中,我们在git中使用标签。我们不时希望通过从远程存储库中删除它们来清理这些标记。
这很简单。一个用户在一组命令中删除本地标签和远程标签。我们有一个结合了两个步骤的小shell脚本。
现在,第二(第三,第四,...)用户具有不再反映在遥控器上的本地标签。
我正在寻找与git remote prune origin
清除本地跟踪分支(已删除远程分支)的命令类似的命令。
或者,可以使用列出远程标签的简单命令与通过传回的本地标签进行比较git tag -l
。
Answers:
好问题。:)我没有完整的答案...
也就是说,您可以通过获得远程标签列表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 remote | xargs -L 1 git ls-remote --tags | 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不会删除任何东西,因为它不会读取stdin(愚蠢的git)。
从远程仓库中获取所有活动标签。
这甚至可以在Windows上使用。
git tag prune origin
命令。
git tag -l | %{git tag -d $_}
使它在PowerShell中工作。不确定其他人。
从Git v1.7.8到v1.8.5.6,您可以使用以下命令:
git fetch <remote> --prune --tags
由于提交e66ef7ae6f31f2,这在较新版本的git(从v1.9.0开始)上不起作用。我真的不想删除它,因为它确实对某些人有用。
正如“ Chad Juliano”建议的那样,从v1.7.8开始,所有Git版本都可以使用以下命令:
git fetch --prune <remote> +refs/tags/*:refs/tags/*
您可能需要在标签部分加上引号(例如在Windows上),以避免通配符扩展:
git fetch --prune <remote> "+refs/tags/*:refs/tags/*"
git fetch --prune <remote> +refs/tags/*:refs/tags/*
在ZSH中不起作用,但在BASH中起作用
*
但是如果您单引号应该没问题。
git fetch origin --prune --prune-tags
OR git fetch origin --prune 'refs/tags/*:refs/tags/*'
OR git fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
修剪远程跟踪分支和标签。在git 2.18版本中签入。
如果只希望遥控器上存在的那些标签,只需删除所有本地标签:
$ git tag -d $(git tag)
然后获取所有远程标记:
$ git fetch --tags
xargs
。如果您的标签数量超过ARG_MAX
,或存在类似的限制,则此方法将无效。不太可能,但是可能,这xargs
就是很棒的原因。
git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
强制别名命令。请享用。:-)
看起来像最新版本的Git(我在git v2.20上)可以简单地说
git fetch --prune --prune-tags
干净得多!
https://git-scm.com/docs/git-fetch#_pruning
您还可以将git配置为在提取时始终修剪标签:
git config fetch.pruneTags true
如果您只想在从特定遥控器中获取标签时修剪标签,则可以使用该remote.<remote>.pruneTags
选项。例如,要在从来源而不是其他远程获取时始终修剪标签,
git config remote.origin.pruneTags true
git fetch
自v1.7.8 以来的所有版本的Git都具有refspec,而自v1.9.0起,该--tags
选项将覆盖该--prune
选项。对于通用解决方案,请尝试以下操作:
$ git --version
git version 2.1.3
$ git fetch --prune origin "+refs/tags/*:refs/tags/*"
From ssh://xxx
x [deleted] (none) -> rel_test
有关Git v1.9.0中具有“ --prune”行为的“ --tags”如何变化的更多信息,请参见:https : //github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
origin
为upstream
git并根据上游纠正了我的本地标签;接下来git push origin :<deleted-tag-name>
更新了我的GitHub fork,删除了已删除的标签。
git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
OR git fetch origin --prune 'refs/tags/*:refs/tags/*'
或git fetch <url of origin> --prune --prune-tags
或或git fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git本机支持清除本地标签:
git fetch --tags --prune
该命令提取最新的标签,并删除所有已删除的标签。
显示本地和远程标签之间的区别:
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/##'
从远程标记路径列表中仅解析标记名称以“ <”开头的行是您的本地标签,不再位于远程仓库中。如果数量很少,则可以逐个手动将其删除;如果数量很多,则可以进行更多grep-ing和管道化操作以使其自动化。
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
,而是以数字开头,后跟逗号,然后看起来像是提交哈希(?)的前三个字符,例如7,8d4
...
刚刚在GitHub上的axisal_git_scripts Gem分支中添加了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版本中(例如v2.26.2)
-P,--prune-tags在获取之前,如果启用了--prune,请删除远程服务器上不再存在的所有本地标记。与--prune不同,应更谨慎地使用此选项,它将删除已创建的所有本地引用(本地标签)。该选项是提供显式标签refspec和--prune的简写,请参阅其文档中的讨论。
因此,您需要运行:
git fetch august --prune --prune-tags