【问题标题】:How to push tags with git subtree?如何使用 git subtree 推送标签?
【发布时间】:2013-07-28 18:33:32
【问题描述】:

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

大师/ 从机1/ 奴隶2/

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

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

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

有什么建议吗?

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

    如“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),但一个想法是:

    • 当您的Slave1 处于稳定状态时,将master 合并为“slave1_br”,并在其中放置标签。
    • 当您的Slave2 处于稳定状态时,将master 合并为“slave2_br”,并在其中放置标签。

    然后:

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

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

    【讨论】:

    • 谢谢!与我的理想解决方案相比仍然有点复杂,但让我了解子拆分支持仍然远非完美:)
    【解决方案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 存储库中拥有与 Master 存储库相同名称的同一提交标记,此处为 1.0.0

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

    【讨论】:

      【解决方案3】:

      我很难找到这一点。

      使用 subtree 时,subtree repo 中的 commit 会有不同的 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,但我认为这就是我想要的。

      【讨论】:

      • 我的答案的有趣替代方案。 +1
      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2011-05-02
      • 2012-09-29
      • 2014-01-25
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多