合并Git仓库到另一仓库子目录并保留历史,文件未进入指定目录
问题排查与正确操作流程
可能踩的坑
- 执行
git filter-repo --to-subdirectory-filter A时,没进到repo_A的本地克隆目录里,等于白跑命令,根本没改到目标仓库 git filter-repo没装对,PowerShell里根本没执行这个命令(没输出大概率是命令不存在,系统直接跳过了)- 合并步骤漏了关键操作,没把处理好的repo_A作为远程仓库加到new_repo里就直接合并
正确操作步骤
1. 先确认工具正常
在PowerShell里输git filter-repo --version,能打出版本号就说明装好了。没装的话用pip install git-filter-repo装一下(前提是你有Python环境)。
2. 处理repo_A
- 先克隆repo_A到本地:
git clone <repo_A的远程地址> repo_A_local - 必须进到这个本地克隆目录里:
cd repo_A_local - 再执行目录过滤命令(这次应该会跳出一堆处理日志):
跑完之后,这个本地仓库里的所有文件都会被移到A子目录下,所有提交历史也会被重写成对应路径的记录。git filter-repo --to-subdirectory-filter A
3. 处理repo_B
跟上面步骤一模一样,把A换成B就行:
git clone <repo_B的远程地址> repo_B_local cd repo_B_local git filter-repo --to-subdirectory-filter B
4. 合并到new_repo
- 新建并初始化新仓库:
mkdir new_repo cd new_repo git init - 把处理好的repo_A本地仓库加为远程,然后拉取:
git remote add repo_A ../repo_A_local git pull repo_A main # 这里的main换成你repo_A实际的主分支名,比如master - 同样处理repo_B,注意要加
--allow-unrelated-histories,因为两个仓库原本没关联历史:git remote add repo_B ../repo_B_local git pull repo_B main --allow-unrelated-histories
检查结果
这时new_repo目录里应该有A、B两个子目录,分别对应原仓库的内容。输git log --oneline能看到两个仓库的所有提交记录,历史完整保留。
内容的提问来源于stack exchange,提问作者buecki
相关产品推荐
相关产品推荐

