You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个作业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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:05:40