如何使用git subtree推送标签?

4
我已成功使用git-subtree创建了一个由几个子版本库组成的大版本库,比如说Master包含Slave1和Slave2。
Master/ Slave1/ Slave2/
现在我想在Master上打标签并将每个标签推送到子版本库,我该怎么做呢?
如果我使用"git push Slave2 --tags",整个标签都会被传输,但我只想传输与Slave2相关的文件。
你可以使用git-subsplit来实现,但这有点不太实用和慢。
有什么建议吗?
3个回答

4
如"如何使“git push”包含分支内的标签?"所述,git 1.8.3(2013年5月)现在包括一个git push --follow-tags选项:
推送所有将被推送而没有此选项的引用,并且推送在refs/tags中缺少但指向可从要被推送的引用到达的提交的带注释标记。
现在,请记住,标记适用于整个存储库(而不是子目录),但一个想法是:
当你有一个稳定的Slave1状态时,将master合并到'slave1_br'中,并在那里打上一个标记。
当您有一个稳定的Slave2状态时,将master合并到'slave2_br'中,并在那里打上一个标记。
然后:
git push --follow_tags slave1 slave1_br
git push --follow_tags slave2 slave2_br

这是我所知道的不推送所有标签,而只推送从你正在推送的分支可达的标签的唯一方法。
我意识到这涉及到不止一个分支(master),但这可能是替代 git-subsplit 的一种选择。


还是有点复杂,离我理想的解决方案还有些距离,但这让我明白了 subsplit 支持仍然远未完善 :) - odino

2

我有一个使用git subtree split的解决方案。

所有操作都在主存储库上完成,您可以使用主分支的任何分支。

首先在主存储库上创建标签

git tag -a 1.0.0 -m "the tag 1.0.0"

创建Slave1的标签

检出该标签

git checkout 1.0.0

创建一个仅包含slave1的分支以用于此标签。
git subtree split --prefix=Slave1 -b slave1_br_1.0.0

在此分支上创建标签。
git checkout slave1_br_1.0.0
git tag -a slave1_tag_1.0.0 -m "the tag 1.0.0"

将标签推送到Slave1存储库

git push slave1 slave1_tag_1.0.0:1.0.0

清理主库

清理分支

git checkout master
git branch -D slave1_br_1.0.0
git tag -d slave1_tag_1.0.0
git gc --prune=now

最终,您将在Slave1存储库上拥有与Master存储库相同的提交标记和相同名称,这里是1.0.0

我认为更好的是,除了为此创建的临时分支外,没有其他分支(只推送了标记)


1
我是通过艰难的方式发现这一点的。
当使用子树时,子树仓库中的提交将具有不同的SHA。
因此,您只需要将提交推送到子树,然后定位要标记的子树仓库中的特定提交,对其进行标记并将其推送到子树仓库即可。
我的设置是使用sourcetree和github.com,但我认为其他情况应该也是相同的。
  1. 我有一个主repo与bitbucket同步,并设置了一个子文件夹作为子树,与github repo同步。
  2. 我在sourcetree中使用此自定义操作来推送子树。
运行的脚本:git 参数:shiny/app是我的子文件夹,webapp是我的github repo远程名称。
subtree push -P shiny/app webapp master --squash
  1. 在子树分支中找到特定的提交,打上标签并将标签推送到子树仓库。

这比上面所有的答案都要简单和清晰。当然,标签仅限于子树而不是完整的仓库,但我认为这就是我想要的。


有趣的替代方案,点赞 +1 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接