我已经使用 git-subtree 成功创建了一个由几个子存储库组成的大型存储库,假设 Master 包含 Slave1 和 Slave2。
主/从1/从2/
现在我想在 Master 上添加标签并将每个标签推送到从仓库,我该怎么做?
如果我“git push Slave2 --tags”会传输整个标签,但我只希望传输与 Slave2 相关的文件。
你可以用 git-subsplit 来实现它,但老实说有点不切实际而且速度很慢。
有什么建议吗?
我已经使用 git-subtree 成功创建了一个由几个子存储库组成的大型存储库,假设 Master 包含 Slave1 和 Slave2。
主/从1/从2/
现在我想在 Master 上添加标签并将每个标签推送到从仓库,我该怎么做?
如果我“git push Slave2 --tags”会传输整个标签,但我只希望传输与 Slave2 相关的文件。
你可以用 git-subsplit 来实现它,但老实说有点不切实际而且速度很慢。
有什么建议吗?
如“如何使“git push”在分支中包含标签? ”中所述,git 1.8.3(2013 年 5 月)现在包含一个git push --follow-tags
选项:
推送所有将在没有此选项的情况下推送的 refs,并推送
refs/tags
远程缺少但指向可从推送的 refs 访问的 commit-ish 的注释标签。
现在,请记住标签适用于完整存储库(不是子目录),但一个想法是:
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
.
我有一个使用 git subtree split 的解决方案
一切都在 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 存储库上拥有与同名的主存储库相同的提交标记,此处为 1.0.0
恕我直言更好的是,为此创建的临时分支没有其他分支appart(仅推送标签)
我很难找到这一点。
使用子树时,子树存储库中的提交将具有不同的 SHA。
因此,您只需要将提交推送到子树,然后在子树存储库中找到要标记的特定提交,将其标记并推送到子树存储库。
我的设置是使用 sourcetree 和 github.com,但我认为它应该与其他情况相同。
要运行的脚本:git
参数:shiny/app
是我的子文件夹,webapp 是我的 github repo 远程名称
subtree push -P shiny/app webapp master --squash
这比上面所有的答案都容易和干净。当然,标签仅限于子树而不是完整的 repo,但我认为这就是我想要的。