28

我想看看我在本地有哪些标签在特定遥控器上不可用。我怎样才能做到这一点?我知道我可以git push --tags推动所有这些。但是,如果有一些我不想推送的标签,我如何确保我没有错过一些?

4

3 回答 3

42

您可以使用以下命令查看本地存在但指定远程中不存在的标签:

git show-ref --tags | grep -v -F "$(git ls-remote --tags <remote name> | grep -v '\^{}' | cut -f 2)"

请注意,它git ls-remote同时显示了带注释的标签和它指向的提交^{},因此我们需要删除重复项。

另一种方法是使用--dry-run/-n标志git push

git push --tags --dry-run

这将显示将推送哪些更改,但实际上不会进行这些更改。

于 2012-07-03T09:44:43.927 回答
2

作为记录,我使用“comm”命令的变体:

comm -23 <(git show-ref --tags | cut -d ' ' -f 2) <(git ls-remote --tags origin | cut -f 2)

我将它用作 .gitconfig 中的 git 别名,并使用如下正确的 bash 引用:

[alias]
    unpushed-tags = "!bash -c \"comm -23 <(git show-ref --tags | cut -d ' ' -f 2) <(git ls-remote --tags origin | cut -f 2)\""
于 2013-06-27T07:42:13.537 回答
1

我发现 Ben Lings 接受的答案错过了部分匹配远程标签的未推送标签;例如,如果存在名为“snowba”或“snow”的远程标签,则不会列出未推送的标签“snowball”。

我制作了一个版本,用于检查当前签出分支中的本地标签和远程仓库中的标签之间的确切名称匹配,以查找未推送的标签:

comm -23 <(echo "$(git tag --list)") <(echo "$(git ls-remote --tags -q | grep -v '\^{}' | cut -f 2 | cut -d '/' -f 3-)") | paste -s -d " " -

如果您只想检查当前签出分支中未推送的标签:

comm -23 <(echo "$(git tag --merged)") <(echo "$(git ls-remote --tags -q | grep -v '\^{}' | cut -f 2 | cut -d '/' -f 3-)") | paste -s -d " " -

在这里,对当前分支中未推送标签的相同查询被溢出到多个语句中,以在 bash 脚本中使用(并且为了提高清晰度):

local_tags_in_current_branch="$(git tag --merged)"
remote_tags="$(git ls-remote --tags -q | grep -v '\^{}' | cut -f 2 | cut -d '/' -f 3-)"
unpushed_tags=`comm -23 <(echo "$local_tags_in_current_branch") <(echo "$remote_tags") | paste -s -d " " -`
于 2022-01-02T21:25:20.410 回答