4

我已经使用 git-subtree 成功创建了一个由几个子存储库组成的大型存储库,假设 Master 包含 Slave1 和 Slave2。

主/从1/从2/

现在我想在 Master 上添加标签并将每个标签推送到从仓库,我该怎么做?

如果我“git push Slave2 --tags”会传输整个标签,但我只希望传输与 Slave2 相关的文件。

你可以用 git-subsplit 来实现它,但老实说有点不切实际而且速度很慢。

有什么建议吗?

4

3 回答 3

4

如“如何使“git push”在分支中包含标签? ”中所述,git 1.8.3(2013 年 5 月)现在包含一个git push --follow-tags选项:

推送所有将在没有此选项的情况下推送的 refs,并推送refs/tags远程缺少但指向可从推送的 refs 访问的 commit-ish 的注释标签。

现在,请记住标签适用于完整存储库(不是子目录),但一个想法是:

  • 当你有一个稳定的状态时合并master到一个' ' ,并在那里放置一个标签。slave1_brSlave1
  • 当你有一个稳定的状态时合并master到一个' ' ,并在那里放置一个标签。slave2_brSlave2

接着:

git push --follow_tags slave1 slave1_br
git push --follow_tags slave2 slave2_br

这是我知道推送所有标签的唯一方法,而只有从您正在推送的分支可以访问的标签。
我意识到这涉及多个分支 ( master),但它可能是git-subsplit.

于 2013-08-05T16:30:47.063 回答
2

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

一切都在 Master Repository 上完成,您可以使用 Master 的任何分支。

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

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

恕我直言更好的是,为此创建的临时分支没有其他分支appart(仅推送标签)

于 2015-11-19T15:52:21.270 回答
1

我很难找到这一点。

使用子树时,子树存储库中的提交将具有不同的 SHA。

因此,您只需要将提交推送到子树,然后在子树存储库中找到要标记的特定提交,将其标记并推送到子树存储库。

我的设置是使用 sourcetree 和 github.com,但我认为它应该与其他情况相同。

  1. 我有一个同步到 bitbucket 的主存储库,以及一个子文件夹设置为子树,同步到 github 存储库。
  2. 我在 sourcetree 中使用这个自定义操作来推送子树

要运行的脚本:git

参数:shiny/app是我的子文件夹,webapp 是我的 github repo 远程名称

subtree push -P shiny/app webapp master --squash
  1. 在子树分支中找到特定的提交,标记它并将标记推送到子树 repo。

这比上面所有的答案都容易和干净。当然,标签仅限于子树而不是完整的 repo,但我认为这就是我想要的。

于 2017-08-24T16:41:04.030 回答