我有一个存储库 B,其内容需要驻留在 A 的子目录中...在 A/src/B 中。我想最终得到一个存储库 A,其中包含来自 A 和 B 的提交历史。
网络上的其他解决方案似乎向我展示了如何在单独的子树中保持树的完整性或 merge 具有相同目录结构的存储库的选定部分。
那么,有没有办法做到这一点?
最佳答案
事实上,这很简单,但命令不一定很明显。如果您稍后需要 merge 来自 B 的更多更新,一个不错的选择是 git-subtree (不要与子树 merge 策略混淆)。你说你想以一个存储库结束,所以使用 git 子模块是不合适的。
这是执行此操作的经典方法,并附有一些解释:
更改为存储库 A:
cd A
从存储库
B
中获取master
分支(或其他分支),并(暂时)将其存储为FETCH_HEAD
:git fetch /home/whoever/dev/B master
执行忽略来自
FETCH_HEAD
的更改的 merge ,但不提交。这样我们就可以稍后提交 merge , merge 的父级将包含FETCH_HEAD
。 (该父项存储在.git/MERGE_HEAD
中。)git merge -s ours --no-commit FETCH_HEAD
从
FETCH_HEAD
中读取树(仍然是B
的提取的master
分支)到子目录源/B
。-u
意味着在工作副本中也反射(reflect)出结果: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
创建 Remote 。请注意,此过程实际上并未使用子树 merge 策略 - 如果我理解正确的话,那只会用于 merge B
的进一步更改。
关于git - merge 不同目录级别的 git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8929071/