我已经成功地用git-subtree创建了一个由几个子存储库组成的大型存储库,假设主存储库包含Slave1和Slave2。
主机/从机1/从机2/
现在我想在Master上添加标签,并将每个标签推送到slave repos,我该怎么做呢?
如果我"git push Slave2 --tags“,整个标签都会被传输,但我只想传输与Slave2相关的文件。
你可以使用git-subsplit来实现它,但说实话,它有点不切实际,而且速度很慢。
有什么建议吗?
发布于 2013-08-06 00:30:47
正如在"How to make “git push” include tags within a branch?“中提到的,git 1.8.3 (2013年5月)现在包含一个git push --follow-tags选项:
推送所有在没有此选项的情况下将被推送的refs,也推送
refs/tags中的注释标记,这些标记从遥控器中缺失,但指向从被推送的refs可访问的commit-ish。
现在,请记住tag applies to the full repository (not a subdirectory),但有一个想法是:
master处于稳定状态时将master合并到‘Slave1’中,并在其中放置标记。当您具有稳定状态<代码>D15时,master合并到'slave2_br‘中,并在其中放置标记。<代码>H216<代码>F217然后:
git push --follow_tags slave1 slave1_br
git push --follow_tags slave2 slave2_br这是我知道的不推送所有标签的唯一方法,但只有一个可以从你推送的分支到达。
我知道这涉及多个分支(master),但它可能是git-subsplit的替代方案。
发布于 2015-11-19 23:52:21
我有一个使用git子树拆分的解决方案。
所有操作都在主存储库上完成,您可以使用主存储库的任何分支。
首先在主存储库上创建标签
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存储库上拥有一个与具有相同名称的主存储库相同的提交标记,此处为1.0.0
IMHO更好的一点是,没有其他分支来自为此创建的临时分支(只有标签被推送)
发布于 2017-08-25 00:41:04
我以一种艰难的方式发现了这一点。
使用子树时,子树存储库中的提交将具有不同的SHA.
因此,您只需要将提交推送到子树,然后在子树存储库中找到您想要标记的特定提交,对其进行标记并推送到子树存储库。
我的设置是使用sourcetree和github.com,但我认为它应该与其他情况相同。
要运行的脚本:git
参数:shiny/app是我的子文件夹,webapp是我的github存储库远程名称
subtree push -P shiny/app webapp master --squash这比上面所有的答案都要简单和清晰得多。当然,标签仅限于子树,而不是完整的repo,但我认为这就是我想要的。
https://stackoverflow.com/questions/17911466
复制相似问题