我们可以设置一个 Git 默认值来在远程拉取期间获取所有标记吗?

我目前有一个 git 远程设置,如下所示:

[remote "upstream"]
url = <redacted>
fetch = +refs/heads/*:refs/remotes/upstream/*

当我在分支主机上发出 git pull时,所有的远程头都被提取到远程/上游,然后远程/上游/主机合并到主机上。可以到达的任何标记也同时获取,这非常方便。

我希望 git pull能够从远程获取 所有标签,而不仅仅是那些可以直接从头部获取的标签。我最初尝试设置 tagopt == --tags,但发现这只会导致标记被提取,因此打破了一切。(朱尼奥甚至说那是 可怕的错位)。

是否有一种方法使 git pull在默认情况下获取所有远程标记,除了远程头?

187518 次浏览

您应该可以通过在本地配置中添加一个 refspec for 标记来实现这一点:

[remote "upstream"]
url = <redacted>
fetch = +refs/heads/*:refs/remotes/upstream/*
fetch = +refs/tags/*:refs/tags/*

一个简单的 git fetch --tags对我很有用。

很简单,做一个

git fetch --all

--force选项对于刷新本地标记非常有用。主要是如果您有浮动标记:

git fetch --tags --force

Git pull 选项也有 --force选项,描述是相同的:

当使用 < rBranch > : < lBranch > refspec 时,它拒绝 除非远程分支 < rBranch > ,否则请更新本地分支 < lBranch > 它获取的是 < lBranch > 的后代 检查完毕。

但是,根据 --no-tags的文件:

默认情况下,标记指向从 本地获取和存储远程存储库。

如果该默认语句不是限制,那么您也可以尝试

git pull --force

对我来说,下面的方法似乎奏效了。

git pull --tags

我在 kernel.org 上与 magit 一起使用它

[remote "upstream"]
url = <redacted>
fetch = +refs/heads/*:refs/remotes/upstream/*
tagOpt = --tags

远程标签被删除了-它们的本地等价物仍然存在于抓取/拉取回购中时,所有的答案对我来说都不起作用。

我发现这种 git fetch属性的组合是找到已删除标签的唯一方法:

git fetch --tags --prune --prune-tags

或者,这可以应用于本地(或全局) git 配置:

...
[remote "origin"]
url = [gitlab url]
fetch = +refs/heads/*:refs/remotes/origin/*
tagopt = --tags
prune = true
pruneTags = true
...

良好的副作用: 这也将工作的 git pull(我无法实现这通过命令行属性)。

添加配置的命令:

git config (--global) remote.origin.tagopt --tags
git config (--global) remote.origin.prune true
git config (--global) remote.origin.pruneTags true