这篇讲用 HTTPS 地址克隆 AngusGit 私有仓库时,用户名和密码分别填什么。看完你可以生成一把只读、只对当前仓库有效的访问令牌,用它完成克隆,并在本机或 CI 里保存这把令牌,避免写进克隆地址。
下文用 AngusGit 线上实例上的真实私有仓库 https://git.anguskit.com/anguskit/AngusKit.git 做示例。照着做时,换成你自己的仓库地址。要用 SSH 密钥,或者要第一次往空仓库推代码,见文末参考里的第一次推送一文。
1. 用户名和密码各填什么
| 终端问的 | 填什么 | 说明 |
|---|---|---|
Username for 'https://git.anguskit.com': |
你的 AngusGit 登录名 | 不是团队名,也不是仓库所有者。示例里的所有者是团队 anguskit,用户名仍填你自己的登录名 |
Password for 'https://<登录名>@git.anguskit.com': |
访问令牌 | 登录密码也能用,但令牌更安全,原因见下 |
推荐令牌而不用登录密码,有三个原因:
- 登录密码能登录整个控制台。它一旦被存进凭据缓存或脚本又泄露出去,别人能做的远不止克隆代码。令牌只用于 Git 克隆和推送,不能用来登录控制台。
- 令牌可以只给
git:read,只给某几个仓库。即使泄露,别人也只能读这几个仓库。 - 令牌有过期时间,也能单独吊销。吊销一把令牌,不影响你的登录密码和其他令牌。
2. 生成一把只读令牌
打开令牌页
侧栏点 我的,切到 访问令牌 页签,点 生成新令牌。
名称、期限和身份确认
令牌名称 写清用途,例如「笔记本克隆 AngusKit」,以后在列表里一眼能认出来。过期时间 和下一步的权限,生成之后都不能再改,要一次选对。过期时间 可选 30天、60天、90天 或 365天。密码验证 里输入你当前的登录密码,确认是你本人在操作。
只给需要的权限
权限范围 勾选
git:read,页面说明是「允许 clone / fetch」。仓库作用域 选 指定仓库,在列表里勾选anguskit/AngusKit,权限设为 READ。以后这把令牌只能读这一个仓库。马上保存
点 生成令牌。页面提示「请立即复制此令牌。出于安全考虑,它将不会再次显示。」点 复制,存进你的密码管理器,再点 我已保存此令牌。之后列表里只显示令牌名称,看不到原文;丢了就只能重新生成。
以后还要用这把令牌推送时,权限范围 要勾 git:write,仓库权限设为 WRITE。只设 WRITE 而不勾 git:write,页面会提示「仓库授予 WRITE 时必须同时勾选 git:write」。
3. 克隆
git clone https://git.anguskit.com/anguskit/AngusKit.git
终端先打印 Cloning into 'AngusKit'...,然后依次出现两个提示:
Username for 'https://git.anguskit.com':
Password for 'https://<登录名>@git.anguskit.com':
第一个填登录名,第二个粘贴刚才保存的令牌。粘贴时屏幕上不显示任何字符,这是正常的,粘贴完直接回车。接着出现 Receiving objects 的进度,就说明认证已经通过、正在下载。命令结束后当前目录下多出一个 AngusKit 文件夹,克隆就完成了。
4. 让 Git 记住令牌
不想每次拉取都粘贴一遍令牌,就交给系统的凭据管理器保存:
- macOS: Git 默认使用钥匙串,第一次输入之后自动保存。
- Windows: Git for Windows 自带凭据管理器,第一次输入之后自动保存。
- Linux: 下面这一行让 Git 把凭据在内存里保留一段时间(默认 15 分钟),不写入磁盘:
git config --global credential.helper cache
也可以用 credential.helper store 长期保存,但它会把令牌以明文写进 ~/.git-credentials,只适合你一个人用的电脑。
5. 在脚本和 CI 里克隆
CI 机器上没有人来输入密码。这时常见的写法是把令牌拼进地址,例如 https://<登录名>:<令牌>@git.anguskit.com/...。不要这样做:这个地址会被写进克隆出来的 .git/config,还容易出现在构建日志里。
改用请求头传令牌。先把令牌放进 CI 的密钥变量,例如 ANGUSGIT_TOKEN,然后:
git -c http.extraHeader="Authorization: Bearer ${ANGUSGIT_TOKEN}" \
clone https://git.anguskit.com/anguskit/AngusKit.git
-c 只对这一条命令生效,令牌不会写进 .git/config。之后在这个目录里再执行 git fetch 或 git pull 时,同样要带上这段 -c。
给 CI 用的令牌,单独生成一把:名称写明是哪条流水线,权限范围 只给 git:read,仓库作用域 只选它要拉的仓库。这样流水线出问题时,吊销这一把就行,不影响其他人。
6. 令牌过期了,或者要换一把
访问令牌 列表里,每把令牌都显示状态(活跃、已过期 或 已吊销)、最后使用 时间、使用次数 和 过期于 的日期。
令牌过期或被吊销后,用它克隆或拉取会认证失败。按下面三步换一把:
- 按第 2 节重新生成一把令牌。
- 清掉 Git 缓存的旧令牌,否则 Git 会一直拿旧的去试:
printf "protocol=https\nhost=git.anguskit.com\n\n" | git credential reject
- 再执行一次
git pull,在提示里填登录名和新令牌。
怀疑令牌泄露时,在列表里点那一把的 吊销,它会立即失效。吊销全部 会让你所有未过期的令牌同时失效,用到这些令牌的脚本和 CI 也会一起停止工作,点之前先想清楚有哪些地方在用。
7. 克隆失败时
| 你看到的 | 原因 | 怎么处理 |
|---|---|---|
fatal: Authentication failed for 'https://git.anguskit.com/anguskit/AngusKit.git/' |
令牌已过期或已吊销;令牌复制时少了字符;用户名填的不是令牌主人的登录名;令牌的 指定仓库 里没有这个仓库;或者 Git 缓存的还是旧令牌 | 到 访问令牌 列表看这把令牌的状态和仓库作用域。用户名填你自己的登录名。缓存过旧令牌时,按第 6 节执行 git credential reject 后重试 |
fatal: could not read Username for 'https://git.anguskit.com': terminal prompts disabled |
在没有终端交互的环境里(CI、脚本)克隆,Git 想问用户名却问不了 | 按第 5 节用 http.extraHeader 传令牌 |
fatal: repository 'https://git.anguskit.com/anguskit/AngusKit.git/' not found |
地址里的所有者或仓库名写错了 | 打开仓库代码页,点绿色的 代码 按钮,从 Clone 面板重新复制地址 |
| 克隆正常,推送被拒绝 | 令牌的权限范围只有 git:read,或者仓库权限只有 READ |
推送需要 git:write 加 WRITE。令牌的 编辑 只能改名称和描述,不能改权限,所以要另外生成一把用于推送 |
常见问题
改了登录密码,令牌要跟着换吗?
不用。令牌和登录密码互相独立。改密码之后,令牌在有效期内照样能用。
访问令牌能用来调用控制台的接口吗?
不能。访问令牌只用于 Git 的 HTTPS 克隆、拉取和推送。控制台和它的接口仍然通过登录会话访问。
同一台电脑要用两个账号克隆不同的仓库,怎么办?
让凭据按完整路径区分。执行 git config --global credential.useHttpPath true 之后,Git 会按每个仓库的完整地址分别保存凭据,两个账号的令牌不会互相覆盖。
不想管令牌,有别的办法吗?
可以改用 SSH。在 我的 → SSH密钥 登记一次公钥,之后用 SSH 地址克隆和推送都不再需要密码或令牌。做法见文末参考里的第一次推送一文。
小结
HTTPS 克隆私有仓库时,用户名填登录名,密码填访问令牌。只读的场景,生成一把只勾 git:read、只选目标仓库的令牌,生成后马上存好。日常使用交给系统凭据管理器记住;CI 里用 http.extraHeader 传令牌,不拼进地址。令牌过期就重新生成一把,再用 git credential reject 清掉旧缓存;怀疑泄露就单独吊销那一把。
结论: HTTPS 克隆私有仓库时,用户名填 AngusGit 登录名,密码填 我的 → 访问令牌 生成的
git:read令牌;CI 中使用http.extraHeader传参,避免把令牌写进克隆 URL。