关于git:将远程存储库导入为具有完整历史记录的子目录

Import a remote repository as subdirectory with full history

我想将远程存储库作为具有完整历史记录的子目录进行合并和分离。如何做到这一点有几种方法和问题。我的第一次尝试是使用子树,但它似乎没有重写文件的历史记录,所以我无法查看合并存储库的历史记录。

下一个尝试是手动合并它,就像塞思·罗伯逊在他的答案中显示的那样:

And the trick to making this work: force Git to recognize the rename
by creating a subdirectory and moving the contents into it.

1
2
3
mkdir bdir
git mv B bdir
git commit -a -m bdir-rename

Return to repository"A" and fetch and merge the contents of"B":

1
2
3
4
5
cd ../a
git remote add -f B ../b
git merge -s ours --no-commit B/master
git read-tree --prefix= -u B/master
git commit -m"subtree merge B into bdir"

To show that they're now merged:

1
2
3
cd bdir
echo BBB>>B
git commit -a -m BBB

To prove the full history is preserved in a connected chain:

1
git log --follow B

到目前为止工作还不错,但似乎大多数类似的工具都不使用git log的follow选项。

所以我需要另一种方法。有人能告诉我一种不用重新命名和保存历史的方法吗?

事先谢谢。


最后,将repo b导入repo a的子目录是"简单"的,我偶然发现了一个小工具,其中包含了如何使用git filter-branch的说明。

1
2
3
4
git filter-branch --index-filter \
  'git ls-files -s | sed"s-\t"*-&newsubdir/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE"' \
  --tag-name-filter cat \
  -- --all

完整的方法是在repo b上使用上面发布的git filter-branch,然后在repo a上运行以下命令来导入这些内容:

1
2
3
4
git remote add -f B ../b
git merge -s ours --no-commit B/master
git read-tree --prefix= -u B/master
git commit -m"subtree merge B into bdir"