在 git 中,如何将我的标签与远程服务器同步



有没有办法让我的本地 git 标签与遥控器的标签保持同步?也就是说 - 不仅在创建时获取新标签(像往常一样,当fetch -ing/pull -ing 时(,而且还修剪不再在遥控器上的标签,并在其他人git push -f标签时删除现有标签。我知道我可以git fetch remotename跟随git remote prune remotename来实现分支的类似行为。

。此外,修剪不再在遥控器上的标签

git fetch 使用 Git 2.17(Q2 2018(获得一个方便的简写删除本地持有的过时标记。

请参阅提交 6317972、提交 97716d2、提交 e249ce0、提交 627a129、提交 d0e0747、提交 2c72ed7、提交 e1790f9、提交 59caf52、提交 82f34e0、提交 6fb23f5、提交 ca3065e、提交 bf16ab7、提交 eca142d、提交 750d0da、提交 0711883、提交 ce3ab21、提交 aa59e0e (09 Feb 2018( by Ævar Arnfjörð Bjarmason ( avar (.
(由Junio C Hamano -- gitster -- 在提交 c1a7902 中合并, 06 Mar 2018(

获取:添加--prune-tags选项并fetch.pruneTags配置

添加一个--prune-tags选项到git-fetch,以及fetch.pruneTags配置选项和一个-P速记(-p --prune(.
这允许执行以下任何操作:

git fetch -p -P
git fetch --prune --prune-tags
git fetch -p -P origin
git fetch --prune --prune-tags origin

或者简单地说:

git config fetch.prune true &&
git config fetch.pruneTags true &&
git fetch

而不是更冗长:

git fetch --prune origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*'

在此功能之前,支持拉动用例是很痛苦的从已删除其分支标记的存储库中定期,并有我们当地的参考资料来反映上游。

在工作中,我们在存储库中为每个推出创建部署标记,并且有很多这样的内容,因此它们会在几周内存档性能原因。

如果没有此更改,则很难在 /etc/gitconfig(在仅用于使用他们(。您需要全局设置fetch.prune=true,然后为每个回购:

git -C {} config --replace-all remote.origin.fetch "refs/tags/*:refs/tags/*" "^+*refs/tags/*:refs/tags/*$"

现在我也可以简单地在/etc/gitconfig中设置fetch.pruneTags=true,运行"git pull"的用户会自动得到修剪我想要的语义。

<小时 />

2021 年 4 月更新,适用于 Windows 2.30.1 和 GitHub 桌面 2.8 的 Git

如果您设置了prunepruneTags选项,则它有效:

cd C:pathtolocalrepo
git config fetch.prune true
git config fetch.pruneTags true

然后点击 在 GitHub Deskop 中获取源:日志将显示:

2021-04-28T20:25:21.244Z - info: [ui] Executing fetch: 
  git -c credential.helper= -c protocol.version=2 fetch --progress --prune origin (took 2.986s)

。遥控器中不存在的任何本地标签都将消失!

以下内容对我有用:

git fetch --prune --tags

一些研究表明,git 无法区分本地和外来标签(所有标签都转到 .git/refs/tags/(。因此,无法确定本地创建的标记和可修剪的远程标记之间的区别。然后,选项将简化为:具有不断增长的标签集,或仅具有服务器上的标签。

git push --tags origin && 
git tag | xargs -n1 git tag -d && 
git fetch --tags

对于后一种行为,删除第一行,并且可能是频繁使用的 git 别名。

另一种方法是在标记点创建一个分支(因为它们可以标识为本地/远程(,并且永远不会再次写入它。然后使用远程名称/分支名称作为签出的标签将使标签保持同步(除了 git fetchgit remote prune remotename (。

无论哪种方式都是黑客,"正确"的答案是停止一直更改标签。

另一个

实际对我有用的解决方案:

git tag -l | xargs git tag -d && git fetch -t

使用这些命令同步标签(删除所有本地然后获取所有远程(

git tag -d $(git tag) # delete all local tags
git fetch --all # fetch all remote to local

git push --tags 会将你的本地标签推送到服务器。默认情况下,git fetch(git pull 或 git pull --rebase 的前半部分(将拉取标签,但您可以指定 -t 或 --tags 来拉取所有这些标签。

我不确定如何修剪远程删除的标签,但提取应该拉下任何强制更新的标签。

免责声明这使用了 git 内部(有些人可能会争辩说文件系统是一个 git 接口,但那是另一天:D(

# Blow away all local tags, this will remove any that are tagged locally
# but are not on the remote
rm .git/refs/tags/*
# Download all the tags from the remote
git fetch --tags

这是一个替代解决方案:

git fetch -p +refs/tags/*:refs/tags/*

从 git fetch 文档中:

-p --修剪

在获取之前,请删除所有不再远程跟踪引用 存在于远程设备上。如果标签是 仅由于默认标记自动关注或由于 --标签选项。但是,如果由于显式 refspec 而获取标记(在命令行或远程配置中,对于 例如,如果使用 --mirror 选项克隆了遥控器(,则它们 也需修剪

最新更新