如何将多个作业Git仓库嵌套入课程仓库并保留提交与分支?
合并多个Git仓库为子目录并完整保留提交与分支
核心思路
通过重写每个作业仓库的提交历史,将所有文件路径映射到对应子目录,再将修改后的分支合并到课程仓库中,实现所有提交、分支的完整保留,且最终仅存在一个远程仓库。
操作步骤
1. 前置准备
- 确保所有作业仓库本地副本已拉取所有远程分支:
git fetch --all - 创建并进入课程仓库目录(已有则直接进入):
mkdir class-repo && cd class-repo git init
2. 导入单个作业仓库(以assignment-1为例)
2.1 添加远程源并拉取所有分支
# 添加作业仓库为远程源 git remote add assignment-1 /本地/assignment-1仓库路径 # 拉取该仓库所有分支、标签与提交历史 git fetch assignment-1 --tags # 为远程分支创建本地追踪分支 for branch in $(git branch -r | grep assignment-1/ | grep -v HEAD); do git branch --track ${branch##assignment-1/} $branch done
2.2 重写提交历史,将文件映射到子目录
使用git filter-repo(官方推荐替代git filter-branch的工具,需提前安装)修改所有提交的文件路径,确保作业内容都在assignment-1子目录下:
# 切换到作业仓库的目标分支(如main/master) git checkout assignment-1-main # 重写历史,将所有文件移动到assignment-1目录 git filter-repo --to-subdirectory-filter assignment-1
注意:该操作会重写仓库历史,执行前务必备份原作业仓库。
3. 合并到课程仓库主分支
# 切回课程仓库主分支 git checkout main # 合并作业分支,允许无关历史合并 git merge assignment-1-main --allow-unrelated-histories
若出现冲突,手动解决冲突后执行:
git add . git commit -m "Merge assignment-1 main branch into class repo"
4. 批量处理所有作业仓库
对assignment-2、assignment-3重复步骤2-3,注意:
- 每个作业仓库使用唯一的远程源名称(如assignment-2、assignment-3)
- 重写历史时指定对应子目录(如
assignment-2) - 合并对应分支(如assignment-2的dev分支需合并到课程仓库的dev分支,无则先创建)
5. 验证与推送
- 查看提交历史:
git log --oneline --graph,确认所有作业提交路径正确 - 切换任意分支验证文件结构:
git checkout assignment-2-dev,检查文件是否在assignment-2目录下 - 推送到远程课程仓库:
git remote add origin /远程/class-repo路径 git push --all origin git push --tags origin
解决你遇到的问题
- 仅拉取master分支:未执行全部分支拉取命令,需通过
git fetch assignment-# --tags+批量创建追踪分支导入所有分支 - 未合并文件错误:合并冲突未解决就执行
git merge --continue,必须手动解决冲突后git add再提交 git fetch --all无效:未为作业仓库添加远程源,无法拉取对应分支
内容的提问来源于stack exchange,提问作者RainyCityCoder
相关产品推荐
相关产品推荐

