跳转至

实验0:希冀平台与课程仓库接入

本节目标

登录希冀平台,进入课程 GitLab,创建一个空项目,并把本地课程仓库配置为 upstream/origin 双远程,完成首次 push

重要限制:只能使用 HTTP(S)

当前希冀平台的 GitLab 只支持 HTTP/HTTPS 协议访问,不要使用 SSH,也不要配置 SSH Key。后续示例中的远程地址都应以 http://https:// 开头。

如果你已经按旧版仓库接入文档做完了

旧版文档中的典型配置是:

  • upstream 指向课程仓库 https://git.ustc.edu.cn/KONC/nexos.git
  • origin 指向旧平台上的个人私有仓库,可能是 git@git.ustc.edu.cn:os2026/<你的私有仓库名>.git,也可能是对应的 HTTPS 地址。

如果你已经完成过旧版流程,不需要重新 clone,也不需要把实验重做一遍。你现在要做的,是在希冀 GitLab 中创建一个空项目,然后把本地仓库的 origin 改成新的希冀 HTTP 地址,再把你已有的分支重新推送过去。下面第 5.1 节给出了对应命令。

1 登录希冀平台

希冀平台地址:http://cscourse.ustc.edu.cn/

进入平台后,从学生入口登录。当前课程平台通常使用学号作为账号,例如 PB20110001。如果你之前已经注册过希冀平台,请使用你原来的密码;如果是首次登录,初始密码通常与账号相同。(如果无法登陆,私信助教解决)

希冀平台登录页

进入课程列表后,选择对应课程进入课程平台。

课程平台入口

首次进入课程平台后,建议先修改默认密码,并完善个人信息,避免后续登录或提交时出现问题。

个人信息与密码修改入口

2 进入课程 GitLab

在课程平台页面中,使用右上角入口进入 GitLab

GitLab 入口

进入 GitLab 后,如果页面先出现登录引导,请直接使用与希冀平台相同的用户名和密码登录。

GitLab 登录引导

如果你之前单独修改过 GitLab 密码、结果现在忘记了,可以先点击页面里的“GitLab 密码重置”,把 GitLab 密码重新改回与平台一致,再继续后续操作。

首次进入 GitLab 时,如果页面要求补充邮箱或完成账号激活,请按提示操作。平台当前通常会同步使用希冀平台的用户名;为了便于助教核对信息,建议不要自行修改用户名。

3 在 GitLab 中创建空项目

成功登录 GitLab 后,再进入“新建项目”页面创建一个项目。请在页面顶部选择 “空白项目”,不要切到“从模板创建”或“导入项目”。

GitLab 创建项目 建议按下面的方式填写:

  1. 在“项目名称”中建议直接填写 nexos,这样后续命令与文档示例可以完全一致。
  2. “项目 URL”和“项目标识串”通常会随项目名称自动生成;如果页面已经自动填好,保持与项目名称一致即可。
  3. “项目描述(可选)”可以留空,不影响后续实验。
  4. “可见性级别”按图中所示保持为“私有”即可。
  5. 不要勾选“使用自述文件初始化仓库”;你本地已经有课程仓库,后面要把现有仓库直接推上来,不需要让远程仓库先自动生成 README

一定要创建空项目

如果你勾选了“使用自述文件初始化仓库”,远程仓库会先多出一条独立历史,后续第一次 git push 很可能出现非 fast-forward 或历史无关的问题。最省事的处理方式通常是删掉这个仓库并重新创建一个空项目。

项目名不必强制叫 nexos

如果你用了其他项目名,也完全可以;但后续命令中的远程地址最后一段就不再是 nexos.git,而要改成你自己的项目名。

4 准备本地课程仓库

如果你已经完成了 实验0:内核编译运行与 GDB 调试 中的 git clone,那么你已经有了本地课程仓库,直接继续本节即可,不需要再克隆第二份。

如果你还没有克隆课程仓库,请先执行:

git clone https://git.ustc.edu.cn/KONC/nexos.git
cd nexos

可以先看一眼当前远程配置:

git remote -v

第一次 clone 完成后,你通常会看到:

$ git remote -v
origin  https://git.ustc.edu.cn/KONC/nexos.git (fetch)
origin  https://git.ustc.edu.cn/KONC/nexos.git (push)

5 把课程仓库设为 upstream,把个人仓库设为 origin

先判断自己属于哪种情况

如果你只是刚从课程仓库 clone 下来,本地还只有一个 origin,并且它当前指向课程仓库,那么执行下面的 rename + add 即可。

如果你已经按旧版文档完成过仓库接入,或者已经做过实验,本地仓库通常已经同时存在 originupstream这时不要再执行 git remote rename origin upstream,否则很可能出现 remote upstream already exists。你应该直接用 git remote set-url origin <新的希冀 HTTP 地址> 修改个人仓库地址,具体见下文第 5.1 节。

现在开始配置双远程。下面仍以项目名为 nexos 为例,但请特别注意:远程地址中的用户名部分应以你在希冀 GitLab 页面上实际看到的内容为准,它有可能并不是学号。因此,最稳妥的做法是先按下图位置复制仓库的 HTTPS 地址,再把它直接填进命令里。

git remote rename origin upstream
git remote add origin <从页面复制的 HTTPS 地址>
git remote -v

如果一切正常,输出应类似于:

$ git remote -v
origin    https://cscourse.ustc.edu.cn/vdir/Gitlab/PB24000000/nexos.git (fetch)
origin    https://cscourse.ustc.edu.cn/vdir/Gitlab/PB24000000/nexos.git (push)
upstream  https://git.ustc.edu.cn/KONC/nexos.git (fetch)
upstream  https://git.ustc.edu.cn/KONC/nexos.git (push)

推荐先直接复制 GitLab 给出的 HTTP 地址

最稳妥的做法,是在你刚创建好的空项目页面中点击“克隆”,然后直接复制“使用 HTTPS 克隆”下面的地址,再把它替换到 git remote add origin ...git remote set-url origin ... 命令中。

不要手动去猜 HTTP 地址,也不要想当然地把“学号”填进 URL。有些同学在希冀 GitLab 中显示的用户名并不是学号,如果手动拼接,很容易把远程地址写错;直接复制页面给出的仓库链接最可靠。

下图红框标出了需要点击和复制的位置:

GitLab 空项目页面中复制 HTTPS 地址的位置

如果你已经改过远程地址

如果你之前误把个人仓库加成了 upstream,或者误用了 SSH 地址,也不用重来,直接执行:

git remote set-url origin <新的 HTTP 地址>
git remote set-url upstream https://git.ustc.edu.cn/KONC/nexos.git

5.1 如果你已经完成了旧版仓库接入

如果你以前已经按旧版仓库接入文档做过“接受邀请邮件 + 配 SSH Key + 私有仓库首次提交”,那么你本地仓库大概率已经是下面这种状态:

$ git remote -v
origin    git@git.ustc.edu.cn:os2026/<你的私有仓库名>.git (fetch)
origin    git@git.ustc.edu.cn:os2026/<你的私有仓库名>.git (push)
upstream  https://git.ustc.edu.cn/KONC/nexos.git (fetch)
upstream  https://git.ustc.edu.cn/KONC/nexos.git (push)

有些同学的 origin 可能不是 SSH,而是旧平台上的 HTTPS 地址;这种情况也一样处理。关键点是:保留当前本地仓库和已有提交,只把 origin 改到希冀平台。

先在希冀 GitLab 中创建一个空项目,然后从空项目页面直接复制仓库的 HTTPS 地址,再在本地仓库执行:

git remote set-url origin <从页面复制的 HTTPS 地址>
git remote -v

确认输出变成下面这样即可:

$ git remote -v
origin    https://cscourse.ustc.edu.cn/vdir/Gitlab/PB24000000/nexos.git (fetch)
origin    https://cscourse.ustc.edu.cn/vdir/Gitlab/PB24000000/nexos.git (push)
upstream  https://git.ustc.edu.cn/KONC/nexos.git (fetch)
upstream  https://git.ustc.edu.cn/KONC/nexos.git (push)

然后把你已经做过的分支重新推送到新的 origin

如果你目前只在 main 上有提交(具体推送方法看第六节,直接输入账号密码会报错):

git push -u origin main

旧提交会保留

只要你是直接在原来的本地仓库里修改 origin,你之前已经完成的提交历史、README.md 测试提交和各实验分支都会继续保留。迁移时不需要重新做实验,也不需要把旧提交手动拷来拷去。

6 创建 personal access token 并完成首次推送

当前平台通过 HTTP/HTTPS 访问 Git 仓库时,不能直接使用登录密码。因此,在第一次 git push 之前,请先创建一个 personal access token,再用它完成认证。

6.1 创建 personal access token

打开课程 GitLabpersonal access token 页面,创建一个新的令牌。

创建时,建议至少勾选以下权限:

  1. write_repository:用于 git push
  2. read_repository:用于 git pullgit fetch 等只读操作。

关于令牌名称或过期时间,可以自行设置一个便于识别的名字,例如 nexos-local,(注意,access token创建后需要立即复制,后续无法再次复制token,只能重新创建)。

6.2 可选:让 Git 记住凭据

如果你不想每次 git push / git pull 都重新输入认证信息,可以先在本地执行:

git config --global credential.helper store

执行后,第一次认证成功时,Git 会把凭据保存在当前用户目录下的 ~/.git-credentials 中。之后在同一台机器上通常就不需要再重复输入了。

6.3 执行首次 push

课程仓库当前默认分支是 main,执行:

git push -u origin main

如果终端要求输入认证信息:

  1. 用户名填写你的课程 GitLab 用户名;它通常与希冀平台账号一致,但不保证一定是学号
  2. “密码”位置不要填写登录密码,而应填写刚才创建的 personal access token

首次推送成功后,main 分支会与远程 origin/main 建立跟踪关系,后续你在该分支上就可以直接使用:

git push
git pull

不要泄露 access token

access token 的作用接近密码。不要把它写进仓库文件、命令截图、聊天记录或提交历史中;如果你怀疑它已经泄露,应立即在 GitLab 中撤销该令牌并重新生成一个新的。

7 之后的日常使用方式

完成本页后,你的仓库关系应当是:

  • upstream:课程公共仓库,用来接收助教发布的更新;
  • origin:你自己在希冀 GitLab 上创建的仓库,用来提交自己的代码。

之后的常见流程通常是:

git fetch upstream --prune
git switch <lab分支名>
git pull --rebase upstream <lab分支名>
git push origin <lab分支名>

更完整的分支管理、merge/rebase 与冲突处理说明,可继续阅读 Git 提交、分支与合并

8 常见错误排查

8.1 repository not found

优先检查以下几项:

  1. 你是否已经在 GitLab 中创建了对应的空项目;
  2. 远程地址中的用户名、项目名大小写是否正确;
  3. 你是否误用了 SSH 地址。

8.2 我已经有本地仓库了,还要不要重新 clone 自己的空项目

不要。你的本地仓库应该继续使用最开始 clone 下来的课程仓库,只需要修改远程配置即可。不要为了接入希冀平台再额外 clone 一份空仓库。

8.3 我误用了 SSH 地址怎么办

直接改回 HTTP 地址即可:

git remote set-url origin <从页面复制的 HTTPS 地址>

8.4 我已经按旧版文档做完了,还要重新 clone

不用。旧版流程已经完成的同学,最常见的情况是本地仓库里已经有了正确的 upstream,只是 origin 还指向旧平台仓库。此时只需要:

  1. 在希冀 GitLab 中创建一个空项目;
  2. git remote set-url origin <新的希冀 HTTP 地址> 改掉 origin
  3. main 和你已经做过的实验分支重新 push 到新的 origin

只要你不删本地仓库,之前的提交历史就都会保留。

8.5 HTTP Basic: Access denied

如果你在 git push 时看到类似下面的报错:

remote: HTTP Basic: Access denied
remote: You must use a personal access token with 'read_repository' or 'write_repository' scope for Git over HTTP.
fatal: Authentication failed

这通常说明你输入了登录密码,而不是 personal access token。处理方法是:

  1. 打开课程 GitLabpersonal access token 页面
  2. 创建一个至少带有 write_repository 权限的令牌;如果你也希望后续 pull / fetch 使用同一个令牌,可以同时勾选 read_repository
  3. 重新执行 git push,用户名填写 GitLab 用户名,“密码”位置填写新生成的令牌。

如果你之前已经把错误的登录密码保存进了 ~/.git-credentials,可以先手动删除其中 cscourse.ustc.edu.cn 对应的那一行,再重新执行 git push 完成认证。

8.6 为什么这里不使用 SSH

这不是因为课程仓库流程特殊,而是因为当前希冀平台上的 GitLab 不支持 SSH 方式访问仓库。因此:

  1. 不要使用 git@... 形式的远程地址;
  2. 不需要为本课程仓库额外配置 SSH Key
  3. 请统一使用页面中提供的 HTTP/HTTPS 地址,并配合 personal access token 完成认证。

如果你误用了 SSH 地址,通常会表现为连接失败、认证失败,或者根本无法完成 clone / push。这时直接把远程地址改回 HTTP/HTTPS 即可。

参考资料