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

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

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

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

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


当前回答

这是一个很好的方法:

Git标签-l | xargs Git标签-d && Git获取-t

来源:demisx.GitHub.io

其他回答

看起来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 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

如果你只想要那些存在于远程的标签,只需删除所有本地标签:

$ git tag -d $(git tag)

然后获取所有远程标签:

$ git fetch --tags

更新@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设置自定义操作…->自定义动作


`Script to run` have to be the `git` path.

我使用git fetch -prune- prune-tags origin来同步标签从远程到本地。

这是一个很好的方法:

Git标签-l | xargs Git标签-d && Git获取-t

来源:demisx.GitHub.io