2023-02 补充课:Git 操作(校内 GitLab 配置与第一次作业布置)¶
内容梗概¶
这是国庆/军训停课两三周后的恢复课,主体是带着学生现场完成作业环境的搭建。课程作业平台从 Gitee 迁移到学校内部的 GitLab(git.cuc.edu.cn),老师现场指导学生注册激活账号、加入课程小组、创建个人仓库、配置 Personal Access Token、克隆仓库、建立 0x01 分支。随后布置并讲解了第一次作业:把英文字符串先做 ROT13 加密再做 ASCII 十六进制编码(以及反向解码),借此复习 Python 基本数据类型与类型转换(ord、hex、切片、循环遍历字符串)。课后留出了大量现场答疑时间,排查了 VPN、代理、token、仓库权限(Owner/Developer 继承问题)等一系列实际故障。
知识点详解¶
1. 作业平台:校内 GitLab(git.cuc.edu.cn)¶
- 此前用 Gitee,因其有用户数量和仓库体积限制,本学期迁移到学校内部的 GitLab:
git.cuc.edu.cn(约 01:10)。 - 该站点**仅限校园网访问**;在校外或连 WiFi 时需先登录学校 VPN:
vpn.cuc.edu.cn(约 04:30、40:58)。 - 登录方式:用**学号 + 平时上网的密码**登录即完成"激活"(约 06:50)。
- 若登录时报 LDAP 错误(红字提示无法登录):需先登录融合服务门户 espace(i.cuc.edu.cn),在"认证设置"中**绑定邮箱(最好是学校邮箱,不要用 QQ 邮箱)**——未绑定邮箱的账号无法被授权进入代码仓库(约 08:20、17:16)。
- 登录后建议开启**两步验证(2FA)**(约 15:51)。
- 用户名(username)必须先改成自己的学号:右上角头像 → Edit profile → Account → 修改 username → Update。老师的脚本靠学号自动把学生加进课程小组;加组完成后可随意改回个性化 ID,因为系统内部用 uid 唯一标识用户(约 15:00–17:10)。
2. 课程小组与仓库结构¶
- 课程小组名为"2023年Python程序设计",学生被加入后可见(约 02:40)。
- 组内有黄老师写的校内 GitLab 使用说明仓库,可供预习(约 25:48)。
- 仓库组织方式(与往年不同):每人一个以自己姓名全拼命名的仓库,整学期复用;每次作业一个分支,命名为
0x01、0x02、0x03……老师按分支名爬取批改(约 26:40、43:15、44:20)。 - 创建仓库:New project → 创建空仓库(Create blank project)→ Project name 用姓名全拼,其余保持默认(自动初始化 README、Private 级别)→ Create(约 28:16–29:40)。
3. HTTPS + Access Token 认证(重点)¶
- 校内 GitLab 只能用 HTTPS,不能用 SSH(出于安全考虑,SSH 是远程登录协议,防火墙规则难写),因此不能配置 SSH key,要改用 Access Token(约 30:20–31:15)。
- 两种 token(约 31:20–33:00):
- Project Access Token:仓库内 Settings → Access Tokens 配置,仅对当前仓库有效;
- Personal Access Token:右上角用户头像 → Preferences(首选项)→ Access Tokens 配置,对用户名下所有仓库有效。推荐用 Personal(省事)。
- 创建 token 的要点(约 33:00–36:10):
- Token name 务必写自己的真实姓名——它会显示在每次 commit 的作者位置,乱写会很难看;
- 把过期日期(Expiration date)删掉,否则默认一个月后过期,届时会莫名其妙连不上;
- 权限(Scopes)只需勾选**读仓库和写仓库两项**(read_repository / write_repository),其余是访问 GitLab API 用的(老师批量拉人进组的脚本才需要 API 权限);
- token 只在创建后显示一次,点 Create 后不要急着动页面,点"眼睛"图标显示并立即复制,妥善保存(如发到微信文件传输助手)。
- 拼接带认证的克隆 URL(约 37:57–40:10):
- 在
https://之后插入oauth2:(OAuth2 是著名第三方认证协议,可扩展阅读)作为"用户名",:后接 token 作为"密码",再用@与域名隔开; - 冒号和 @ 必须是英文符号,用中文冒号会导致失败;
- 这种
协议://用户名:密码@域名/路径的形式源自早期 FTP 的用法(额外知识)。
4. 克隆与分支操作¶
- 克隆方式一:TortoiseGit(小乌龟)——文件夹空白处右键 → 克隆 → 粘贴拼接好的 URL → OK。注意 SSH 私钥(Load Putty Key)一栏再也不用了(约 40:10–40:55)。
- 克隆方式二:命令行——在目标目录下执行
git clone <拼接好的URL> [目录名](约 41:50)。 - 克隆失败排查(约 40:55、42:17):
- 报红框错误 → 多半**没登 VPN**;
- 登了 VPN 仍报同样的错 → 检查是否给 Git 或系统配过**代理(科学上网)**,代理会把流量导到境外 IP,VPN 等于白登,必须排除所有代理干扰(包括全局代理)。
- 创建并切换分支(约 43:45–45:30):
- 小乌龟:右键 → TortoiseGit → Create Branch(创建分支),命名
0x01→ OK;再右键 → Switch/Checkout(切换/检出)→ 下拉选0x01→ OK。创建和切换是两个独立步骤,创建后仍在main分支上,必须再切换; - 命令行:
git checkout -b 0x01——一条命令同时完成"创建 + 切换"(小乌龟界面底部也能看到等效命令);已存在的分支要切回去只用git checkout 0x01,不要再加-b(-b是创建新分支); - Mac 用户没有小乌龟,直接用终端执行上述命令行即可(约 46:25)。
- 切换分支后,提交(commit)会落在当前分支上而非
main(约 45:50)。 - 提交与推送(约 1:13:32):add → commit → push;首次 push 时远端尚无该分支,push 会自动在远端创建
remote branch 0x01。
5. 环境相关补充¶
- 写代码环境:装 Python + VS Code(也可用 PyCharm 或 Anaconda,自选)(约 19:10、52:00)。
- 下载 Python:Windows 选 64 位 installer(recommended);macOS 只有一个选项(约 51:10)。
- Mac 上要用
python3和pip3,不能输python:macOS 系统自带 Python 2 占用了python这个名字,手动安装的 Python 3 用python3区分(约 49:20–50:30)。 - VS Code 技巧:用 VS Code "打开文件夹"打开仓库后,内置终端(快捷键 Ctrl +
)会**自动 cd 到该文件夹**,无需手动切换路径;Windows 的 cmd 不认ls,要用dir`(约 1:07:59–1:09:00)。
6. 作业涉及的语言知识¶
- 字符串单/双引号都可以,但**不要混用**,选定一种风格就贯穿始终(约 59:10–1:00:20)。
- 字符串是**可迭代对象**:
for char in confession:逐个取出字符,无需像 C 语言那样用i = 0; i++做索引(约 1:00:50–1:02:10)。 - 内置函数
ord(x):把单个字符转成整数(如大写I→ 73)(约 1:02:15–1:03:45)。 - 内置函数
hex(x):把整数转成**带0x前缀的小写十六进制字符串**(约 1:03:47–1:04:35)。 - 字符串切片
s[start:end]:半开区间,取到end-1;start为 0 可省略,取到结尾时end可省略。作业中用[2:]去掉hex()结果的0x前缀(约 1:04:45–1:06:45)。 - 字符串拼接可用
+=(如message += t)(约 1:07:17)。 - VS Code 中演示了 GitHub Copilot(GPT-4)自动补全,教育优惠可申请(顺带提及,约 1:06:58)。
示例与演示¶
第一次作业:ROT13 + ASCII 十六进制 编解码器(约 53:40 起)¶
- 作业要求:写一个"神秘数字"生成器/解析器——把任意英文字符串(示例
"I love python")先经 ROT13 加密,再转成 ASCII 码的十六进制小写字符串(编码);并能把这串十六进制还原回原文(解码)。编码和解码都要写;先 ROT13 再 ASCII 或先 ASCII 再 ROT13 均可,只要编解码能对上。 - 背景知识:ASCII 码表(大写
A= 65,小写a= 97);凯撒密码平移思想,ROT13 即平移 13 位(A↔N、B↔O、C↔P),因字母共 26 个,ROT13 加密和解密是同一个操作(约 54:00–57:50)。 - 课上示例代码(example.py)要点:
confession = 'I love python',message = ''初始化空结果串;for char in confession:逐字符取出;number = ord(char)转成整数;hex(number)[2:]转十六进制并切片去掉0x前缀;message += ...拼接到结果串;python example.py运行输出编码结果。- 作业框架(老师已搭好,完形填空式):提供
encode(message)与decode(message)两个函数骨架,内部调用三个待完成的函数:rot13()、ASCII 编码、ASCII 解码。encode = 先 ROT13 再 ASCII 编码;decode 顺序相反(先 ASCII 解码再 ROT13)。其中 ASCII 编码部分基本可直接搬示例代码,实际只需新写约两个函数(约 1:09:35–1:12:35)。 - 提交方式:代码放到本地仓库,在
0x01分支上 commit 并 push 到自己的仓库即可,老师按分支爬取批改。下节课会先讲完整答案才到截止时间,不会写不用有压力,但鼓励自己动脑(约 1:15:42)。 - 参考往届:可去课程组里看师兄师姐的仓库结构(一个仓库、多次作业多个分支)(约 26:15)。
现场答疑中暴露的典型故障(约 1:17:00–1:39:26)¶
Ask a project Owner or Maintainer to create a default branch:学生 push 报权限错误。原因是**仓库权限继承自小组权限**——学生在小组里是 Developer,不是各自仓库的 Owner/Maintainer,导致无法初始化默认分支。这是平台机制问题,老师课后去研究批量把学生设为各自仓库 Owner。- 有学生误删了
main分支,报default branch main does not exist。 - 小乌龟本身损坏(证书找不到 / service not found):需重装或改用命令行。
- URL 拼接错误(协议写错、token 复制错):逐项核对 URL 与 token。
- 克隆后文件夹上没有绿色勾号图标:那是资源管理器的图标覆盖层,可能被第三方桌面插件抢占,不影响使用,无需处理。
重点与难点¶
- 必须先连校园网/VPN,且**关闭一切代理**,否则克隆一定失败——这是本课最高频的坑。
- 绑定学校邮箱(融合门户认证设置)是登录校内 GitLab 的前置条件,LDAP 报错都源于此。
- **username 先改成学号**再让老师拉进组;token 的 name 写真名;这两个"命名"要求都直接影响老师收作业。
- Personal vs Project Access Token 的区别要能分清;token 只显示一次,务必当场复制保存;删掉过期时间;只勾读写仓库两项权限。
- URL 拼接格式
https://oauth2:TOKEN@域名/路径中**符号必须是英文**(中文冒号是不行的)。 - 创建分支 ≠ 切换分支:小乌龟要两步;命令行
git checkout -b一步到位;已存在的分支切回时不能再加-b。每次作业务必在0x01分支上提交,不要提到main。 - 分支命名必须是
0x01、0x02……,这是批改脚本的约定。 hex()结果带0x前缀且返回的是字符串;切片[2:]去前缀是"半开区间 + 省略端点"两个知识点的复合运用。- 不要合并(merge)分支,各作业分支保持独立。
关联内容¶
- 前置知识:依赖"基本数据类型基础"章节(数字、字符串、类型转换、
ord/hex、切片、可迭代对象),老师明确说本次作业就是督导大家补看该章节视频;同时默认学生有 C 语言基础(循环索引、ASCII 编码)。 - 与《计算机系统原理与维护》课的关联:Git 收作业的方式沿袭自该课;但分支用法不同(当年不是一人一仓多分支),且当年用 SSH key + 小乌龟,本课改用 HTTPS + token(小乌龟的私钥选项不再使用)。
- 与第 10 章(第三方库与虚拟环境)的关联:课上提到 pip/pip3、Anaconda 安装、国内环境下 Mac 的
python3/pip3区分,与环境搭建章节呼应。 - 后续衔接:本次作业的完整答案将在下一节课讲解,之后才到提交截止时间;以后每次作业均按本课建立的流程(克隆 → 建
0xNN分支 → 写代码 → commit → push)进行。 - 扩展阅读:OAuth2 认证协议;凯撒密码与 ROT13;GitLab API(老师批量拉人脚本的原理)。