在不同的目录级别合并git存储库

fod*_*don 7 git

我有一个存储库B,其内容需要驻留在A/src/B中A ...的子目录中.我想最终得到一个存储库A,其中包含A和B提交的历史记录.

Web上的其他解决方案似乎向我展示了如何在独立的子树中保持树的完整性,或者合并具有相同目录结构的存储库的选定部分.

那么,有没有办法做到这一点?

Mar*_*air 27

事实上,这很简单,但命令不一定是显而易见的.如果你以后需要从B中加入更多更新,那么一个不错的选择是git-subtree(不要与子树合并策略混淆).您说您希望最终得到一个存储库,因此使用git子模块是不合适的.

这是经典的做法,有一些解释:

  1. 转入存储库A:

    cd A
    
    Run Code Online (Sandbox Code Playgroud)
  2. master从存储库中获取分支(或其他)B,并(暂时)将其存储为FETCH_HEAD:

    git fetch /home/whoever/dev/B master
    
    Run Code Online (Sandbox Code Playgroud)
  3. 执行忽略更改FETCH_HEAD但不提交的合并.这样我们以后可以提交合并,并且合并的父级将包含FETCH_HEAD.(该父项存储在.git/MERGE_HEAD.)

    git merge -s ours --no-commit FETCH_HEAD
    
    Run Code Online (Sandbox Code Playgroud)
  4. FETCH_HEAD(仍然是获取的master分支B)读取树到子目录的临时区域src/B.的-u手段来反映,在工作副本的结果,以及:

    git read-tree --prefix=src/B/ -u FETCH_HEAD
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最后提交结果:

    git commit -m "Merge in the history of master from B into src/B"
    
    Run Code Online (Sandbox Code Playgroud)

这类似于GitHub关于子树合并策略的帮助页面中的建议,除了我已经跳过创建一个遥控器B.请注意,此过程实际上还没有使用子树合并策略 - B如果我理解正确的话,那只会包含进一步的更改.

  • Git 2.9及更高版本将[如果历史记录不相关,将无法合并](https://github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txt#L58-L68)。如果收到错误消息:“致命:拒绝合并无关的历史记录”,请将`--allow-unrelated-histories`标志传递给`git merge`。 (2认同)