我已经用git-subtree成功创建了一个由一些subrepos组成的大型回购,让我们说Master包含Slave1和Slave2。
主/ SLAVE1 / SLAVE2 /
现在我想在Master上标记并将每个标记推送到slave repos,我该怎么办?
如果我“git push Slave2 --tags”整个标签被传输,但我只想传输与Slave2相关的文件。
你可以用git-subsplit实现它,但老实说有点不实用和慢。
有什么建议吗?
答案 0 :(得分:4)
如“How to make “git push” include tags within a branch?”中所述,git 1。8。3(2013年5月)现在包含git push --follow-tags
选项:
在没有此选项的情况下推送将被推送的所有引用,并且还在
refs/tags
中推送远程数据库中缺少的注释标记,但是指向可以从被推送的引用中访问的commit-ish。
现在,请记住一个tag applies to the full repository (not a subdirectory),但有一个想法是:
master
的稳定状态时,将slave1_br
合并为“Slave1
”,然后在其中添加标记。master
的稳定状态时,将slave2_br
合并为“Slave2
”,然后在其中添加标记。然后:
git push --follow_tags slave1 slave1_br
git push --follow_tags slave2 slave2_br
这是我知道不推送所有标签的唯一方法,但只能从您推送的分支机构中找到的那个。
我意识到涉及多个分支(master
),但它可以替代git-subsplit
。
答案 1 :(得分:2)
我有一个使用git子树分割的解决方案
所有操作都在Master Repository上完成,您可以使用Master的任何分支。
git tag -a 1.0.0 -m "the tag 1.0.0"
结帐标记
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
恕我直言更好的是,为此创建的临时分支没有其他分支appart(仅推送标签)
答案 2 :(得分:1)
我发现这很困难。
使用子树时,子树仓库中的提交将具有不同的SHA。
所以你只需要将提交推送到子树,然后找到要标记的子树仓库中的特定提交,标记它并推送到子树仓库。
我的设置是使用sourcetree和github.com,但我认为它应该与其他情况相同。
脚本:git
参数:shiny/app
是我的子文件夹,webapp是我的github repo远程名称
subtree push -P shiny/app webapp master --squash
这比上面的所有答案都容易和清洁。当然标签仅限于子树而不是完整的回购,但我认为这就是我想要的。