【问题标题】:Can I do a subtree merge from a subdirectory?我可以从子目录进行子树合并吗?
【发布时间】:2013-05-17 06:52:43
【问题描述】:

让我们假设有两个 git 存储库,其中包含一些文件:

ProjectA
+ a
+ b

ProjectB
+ foo/x
+ foo/y
+ bar/z

现在我想将 ProjectB 中的目录 foo 包含到 ProjectA 中。

据我所知,当我执行git subtree add 时,prefix 是它在接收存储库中应该具有的路径,所以当我这样做时

git subtree add --prefix=project_b --squash URL_of_ProjectB

我最终会得到

ProjectA
+ a
+ b
+ project_b
  + foo/x
  + foo/y
  + bar/z

我能否以某种方式指定我只想获取 foo 来获取此布局?

ProjectA
+ a
+ b
+ project_b
  + x
  + y

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

    我认为git subtree 无法做到这一点。也许git filter-branch 是你需要的:

    git remote add b <URL_TO_B>
    git fetch b
    git checkout -b b_master b/master
    

    改写b只包含foo的历史:

    git filter-branch --prune-empty --subdirectory-filter foo b_master
    

    或使用git subtree split

    git subtree split -P foo --branch foo
    

    并将其添加为子树

    git subtree add --prefix=project_b --squash b_master or foo
    

    【讨论】:

    • 这是否会改变将 ProjectB 中的进一步更改合并到 ProjectA 中的过程?我认为我的场景正是git subtree 的用途,但如果不是,可以用它来完成什么?也许我可以更改我的文件布局以更好地适应它。
    • 是的,每次要将 ProjectB 中的更改合并到 ProjectA 中时,都必须重做过滤分支步骤。 git subtree 的手册页解释了 git split 命令,它类似于我给出的 filter-branch 命令。但是,如果您可以更改布局,最好将foo 的内容提取到单独的存储库中,并将其作为子树添加到两个项目中。也许这更好,因为b 是某种库?
    • 这就是问题所在,不是真的。如果是的话,我会把它变成一个子模块。它是两个项目之间共享的一些代码……国家列表、一些模板等。
    • 我选择在原始存储库中使用git subtree split 拆分子树,推送新分支,然后使用git subtree add 将该分支获取到接收分支。谢谢。
    • 是否也可以将提取的目录“foo”上的更改从 ProjectA 合并回 ProjectB?
    猜你喜欢
    • 2011-05-12
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2010-11-07
    相关资源
    最近更新 更多