我按照this blog post中的步骤将一个git repo的内容复制到另一个。 (它涉及创建一个远程,获取,然后使用带有路径名映射的读取树。)当我想要在后续更改中合并时,问题就出现了。合并不知道路径名映射。有什么方法可以告诉它吗?
这是我将第二个回购的内容添加到更大的回购中的过程。
git remote add projB <github-remote-location>
git merge -s ours --no-commit projB/master
git read-tree --prefix=subdirB/ -u projB/master
git ci -m "merging projB into subdirB"
然后,使用git add在旧的'projB'仓库中添加新内容,然后在合并的仓库中运行:
git fetch projB
git pull projB SomeTag
新文件中出现的结果显示在未重定位的位置。
答案 0 :(得分:1)
简短的回答是:
git pull -s subtree projB SomeTag
git
默认情况下不会跟踪移动或重命名。它恰好似乎通过相似性来捕获一些,但在存储库的深处它并不保留这些信息。此外,它无法用新文件猜测那种元数据。
您键入的命令对这些元数据没有任何神奇的作用。他们最终所做的就是创建一个新的HEAD
提交,恰好:
将projB/master
作为额外的祖先(第2行)。基础祖先是您当前的HEAD。在线性基线的通常情况下,所有提交都有一个祖先,除了最初的没有任何祖先。具有多个祖先的提交称为“合并”提交。
包含projB/master
包含的所有内容,向下移至子目录subdirB
(第3行)
但是在创建合并提交之后(第4行),不会再记住了。特别是哪个文件来自结果树中的哪个文件。
显然,用例经常出现,有人写了一个subtree
合并策略,这恰好是在寻找合并的ref是否在其他地方比在root更合适。但是必须明确要求这种行为。
你链接的博客文章碰巧提到它,但它隐藏在最底层;作者没有在他的TL中提醒它; DR。你可以在git文档中找到a more condensed version of the story,它也是a section in the Pro Git book。