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

时间:2014-09-23 14:08:27

标签: git version-control merge

我希望从远程存储库合并和解耦,作为具有完整历史记录的子目录。有几种方法和问题如何做到这一点 我的第一次尝试是使用子树,但似乎没有重写文件的历史记录,因此我无法查看合并存储库的历史记录。

接下来尝试手动合并,就像他answer中出现的Seth Robertson一样:

  

使这项工作成功:强制Git识别重命名   通过创建一个子目录并将内容移入其中。

mkdir bdir
git mv B bdir
git commit -a -m bdir-rename
     

返回存储库" A"并获取并合并" B":

的内容
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"
     

表明他们现在已合并:

cd bdir
echo BBB>>B
git commit -a -m BBB
     

要证明完整的历史记录保留在连接链中:

git log --follow B

到目前为止工作正常,但似乎大多数工具都没有使用git log关注选项。

所以我需要另一种方法来做到这一点。任何人都可以告诉我一种无需重命名和保留历史记录的方法吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

最后解决方案是"简单"将repo B 导入repo A 的子目录。我偶然发现了small tool,其中包含有关如何使用git filter-branch的说明。

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 上运行以下命令来导入内容:< / p>

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"

答案 1 :(得分:1)

问题中的两个解决方案都是子树合并。实际上,要简化检查目标存储库中的历史记录,您需要重写源代码中的历史记录并进行合并。但是filter-branchdiscouraged

假设您要将存储库a合并到b中(假设它们并排放置):

cd a
git filter-repo --to-subdirectory-filter a
cd ..
cd b
git remote add a ../a
git fetch a
git merge --allow-unrelated-histories a/master
git remote remove a

为此,您需要安装git-filter-repo

合并两个大型存储库,然后将其中一个放入子目录的示例:https://gist.github.com/x-yuri/9890ab1079cf4357d6f269d073fd9731

更多here