合并多Git仓库后,如何在根目录直接查看全量提交历史?
Git多仓库合并后根目录查不到子仓库历史的解决办法
问题根源
你之前用git filter-repo迁移仓库到子目录时,只是把最终文件移到了子目录,但原仓库的所有提交记录里,文件路径还是原来的根路径(比如原foo仓库的readme.md,迁移后提交里的路径还是readme.md,不是foo/readme.md)。Git默认只会追踪当前目录下匹配路径的历史,所以根目录下看不到这些旧提交,必须用--follow或者进入子目录才行。
最优解决方案:重写原仓库历史再合并
如果还能拿到三个原仓库的本地副本,建议重新处理每个仓库的历史,让所有提交的文件路径都带上子目录前缀,再合并,这样根目录就能直接看到所有历史:
1. 逐个处理原仓库的历史(以foo仓库为例)
- 进入foo仓库的本地文件夹:
cd /path/to/your/foo-repo - 用
git filter-repo把所有提交里的文件都移到foo/目录下:
这一步会彻底改写foo仓库的所有提交,以后看这些提交时,所有文件路径都会自动带上git filter-repo --to-subdirectory-filter foofoo/前缀,比如原提交修改的src/utils.js会变成foo/src/utils.js。
2. 处理另外两个仓库
对bar和baz仓库重复上面的操作,分别执行:
git filter-repo --to-subdirectory-filter bar
git filter-repo --to-subdirectory-filter baz
3. 创建新仓库并合并处理后的分支
- 新建一个空仓库:
mkdir combined-repo && cd combined-repo git init - 添加三个处理后的仓库作为远程源:
git remote add foo /path/to/processed-foo-repo git remote add bar /path/to/processed-bar-repo git remote add baz /path/to/processed-baz-repo - 依次拉取并合并每个仓库的分支(这里假设分支名是main,根据实际情况调整):
git pull foo main --allow-unrelated-histories git pull bar main --allow-unrelated-histories git pull baz main --allow-unrelated-histories
已合并后的补救方案
如果已经完成了旧的合并,不想重新来过,可以在合并后的仓库里用git filter-repo批量改写提交路径:
- 进入合并后的仓库:
cd /path/to/your/combined-repo - 针对每个原仓库对应的分支,重写路径前缀(比如原foo仓库的分支是
foo-origin):
对bar和baz仓库的分支执行同样的命令,替换成对应的分支名和子目录。不过这个方法需要你清楚每个原仓库对应的分支,操作起来不如重新处理原仓库直观,优先推荐前面的方案。git filter-repo --path-rename '':foo/ --refs refs/heads/foo-origin
验证效果
处理完成后,在根目录直接执行git log就能看到所有原仓库的提交记录,用git show <commit-sha>也能直接看到提交修改的文件(路径已经是子目录下的),不需要再加--follow或者切换子目录。
内容的提问来源于stack exchange,提问作者rookie
相关产品推荐
相关产品推荐

