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

时间:2012-01-19 15:52:44

标签: git

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

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

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

1 个答案:

答案 0 :(得分:22)

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

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

  1. 更改为存储库A:

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

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

    git merge -s ours --no-commit FETCH_HEAD
    
  4. FETCH_HEAD(仍然是master的提取的B分支)中读取树到子目录src/B的暂存区域。 -u表示也反映了工作副本中的结果:

    git read-tree --prefix=src/B/ -u FETCH_HEAD
    
  5. 最后提交结果:

    git commit -m "Merge in the history of master from B into src/B"
    
  6. 这类似于GitHub's help page on the subtree merge strategy中建议的内容,但我已跳过为B创建遥控器。请注意,此过程实际上还没有使用子树合并策略 - 如果我理解正确的话,那只会用于从B加入进一步的更改。