我希望从远程存储库合并和解耦,作为具有完整历史记录的子目录。有几种方法和问题如何做到这一点 我的第一次尝试是使用子树,但似乎没有重写文件的历史记录,因此我无法查看合并存储库的历史记录。
接下来尝试手动合并,就像他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
的关注选项。
所以我需要另一种方法来做到这一点。任何人都可以告诉我一种无需重命名和保留历史记录的方法吗?
提前致谢。
答案 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-branch
是discouraged。
假设您要将存储库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。