我有一个存储库B,其内容需要驻留在A / src / B中A ...的子目录中。我想最终得到一个存储库A,其中包含A和B提交的历史记录。
网络上的其他解决方案似乎向我展示了如何在单独的子树中保持树的完整性,或者合并具有相同目录结构的存储库的选定部分。
那么,有没有办法做到这一点?
答案 0 :(得分:22)
这是经典的做法,有一些解释:
更改为存储库A:
cd A
从存储库master
中获取B
分支(或其他),并(暂时)将其存储为FETCH_HEAD
:
git fetch /home/whoever/dev/B master
执行忽略FETCH_HEAD
更改但不提交的合并。这样我们以后可以提交合并,合并的父级将包括FETCH_HEAD
。 (该父项存储在.git/MERGE_HEAD
。)
git merge -s ours --no-commit FETCH_HEAD
从FETCH_HEAD
(仍然是master
的提取的B
分支)中读取树到子目录src/B
的暂存区域。 -u
表示也反映了工作副本中的结果:
git read-tree --prefix=src/B/ -u FETCH_HEAD
最后提交结果:
git commit -m "Merge in the history of master from B into src/B"
这类似于GitHub's help page on the subtree merge strategy中建议的内容,但我已跳过为B
创建遥控器。请注意,此过程实际上还没有使用子树合并策略 - 如果我理解正确的话,那只会用于从B
加入进一步的更改。