如何使用git子树推送标签?

时间:2013-07-28 18:33:32

标签: git git-subtree

我已经用git-subtree成功创建了一个由一些subrepos组成的大型回购,让我们说Master包含Slave1和Slave2。

主/   SLAVE1 /   SLAVE2 /

现在我想在Master上标记并将每个标记推送到slave repos,我该怎么办?

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

你可以用git-subsplit实现它,但老实说有点不实用和慢。

有什么建议吗?

3 个答案:

答案 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"

为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

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

答案 2 :(得分:1)

我发现这很困难。

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

所以你只需要将提交推送到子树,然后找到要标记的子树仓库中的特定提交,标记它并推送到子树仓库。

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

  1. 我有一个主要的repo同步到bitbucket,一个子文件夹设置为子树,同步到github repo。
  2. 我在sourcetree中使用此自定义操作来推送子树
  3. 要运行的

    脚本:git

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

    subtree push -P shiny/app webapp master --squash
    
    1. 在子树分支中查找特定提交,标记它并将标记推送到子树仓库。
    2. 这比上面的所有答案都容易和清洁。当然标签仅限于子树而不是完整的回购,但我认为这就是我想要的。