如何将本地标记镜像到远程

时间:2017-02-01 04:54:29

标签: git bash

关于SO有数百个Git标记问题,但我找不到这个问题。

如何将本地git标记镜像到远程。

那是:

  1. 无论origin
  2. 的原始状态如何
  3. 我想要一个bash函数,它将所有本地标签镜像到遥控器。
  4. 这包括在本地创建,删除或移动标记时进行同步。
  5. 这个脚本的反面随处可见,但是就这个方向我找不到任何东西。

    git tag -l | xargs git tag -d
    git fetch --tags
    

1 个答案:

答案 0 :(得分:1)

第1部分相对容易,第2部分不太容易,第3部分通常是不可能的,因为记录的信息不够。

这是一个例子。您检查存储库 L (您在本地使用),并发现标签T1存在,T2不存在,并且T3存在。

现在检查 L 原点的存储库 O ,并发现标签T1,T2和T3都存在。

实际发生了什么:“标签T2确实存在于 L 并且明确删除”或“标签T2从未存在于 L ,但是以某种方式添加到< EM> 0 的“?

由于Git不保存这类数据,因此无法判断T2是否被明确删除,或者从未被提取过。

如果您的要求更简单 - 如果您不关心 T2是否已添加到 O ,您只需要让 O 拥有 L 的标签无论为什么 L 都有这些标签而不是其他标签 - 那么你需要做的就是两行脚本所做的一样,但在其他方向:首先,删除所有标签(但在 O 上,而不是在 L 上),然后再次从 O 到 L git push --tags或等效。

最容易在托管 O 的机器上删除 O 的标签,但假设您不担心原子性问题,可以从

git ls-remote origin 'refs/tags/*'

(它将为您提供origin上的所有标记),然后:

git push --delete origin refs/tags/T1 refs/tags/T2 ...

(对所有标签重复),然后:

git push --tags origin

请注意git ls-remote显示标记对象名称及其最终目标对象:

7446b8fa5ead8ce0990e8f2be3a2490eac8e199f        refs/tags/v2.9.0
05219a1276341e72d8082d76b7f5ed394b7437a4        refs/tags/v2.9.0^{}
7590ed7abf57429b36761c00377a3648630029bd        refs/tags/v2.9.0-rc0
3a0f269e7c82aa3a87323cb7ae04ac5f129f036b        refs/tags/v2.9.0-rc0^{}
c93578b0c65ac46bb6bba0750542798518f09335        refs/tags/v2.9.0-rc1
60bd4b1c513bb652cdffad44382046ca872140eb        refs/tags/v2.9.0-rc1^{}

所以这需要一点点过滤;如果你可以强制推送来覆盖标签,你可以通过推动+refs/tags/*:refs/tags/*作为主要refspec,以及一些:refs/tags/xyz辅助refspec来删除任何“无关”标签(如我上面的例子中T2。这需要一个稍微聪明的脚本。一种愚蠢而简单的方法是仅打印未加标签的标签,例如:

git ls-remote origin 'refs/tags/*' | awk '/\^{}$/ { next } { print $2 }'

然后你可以管道到xargs git push --delete origin

相关问题