ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AngusGit HTTPS 克隆私有仓库:密码填访问令牌

AngusGit HTTPS 克隆私有仓库:密码填访问令牌

这篇讲用 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. 生成一把只读令牌

  1. 打开令牌页

    侧栏点我的,切到访问令牌页签,点生成新令牌。

  2. 名称、期限和身份确认

    令牌名称写清用途,例如「笔记本克隆 AngusKit」,以后在列表里一眼能认出来。过期时间和下一步的权限,生成之后都不能再改,要一次选对。过期时间可选30天、60天、90天或365天。密码验证里输入你当前的登录密码,确认是你本人在操作。

  3. 只给需要的权限

    权限范围勾选git:read,页面说明是「允许 clone / fetch」。仓库作用域选指定仓库,在列表里勾选anguskit/AngusKit,权限设为READ。以后这把令牌只能读这一个仓库。

  4. 马上保存

    点生成令牌。页面提示「请立即复制此令牌。出于安全考虑,它将不会再次显示。」点复制,存进你的密码管理器,再点我已保存此令牌。之后列表里只显示令牌名称,看不到原文;丢了就只能重新生成。

以后还要用这把令牌推送时,权限范围要勾git:write,仓库权限设为WRITE。只设WRITE而不勾git:write,页面会提示「仓库授予 WRITE 时必须同时勾选 git:write」。

3. 克隆

gitclone 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 分钟),不写入磁盘:
gitconfig--globalcredential.helper cache

也可以用credential.helper store长期保存,但它会把令牌以明文写进~/.git-credentials,只适合你一个人用的电脑。

5. 在脚本和 CI 里克隆

CI 机器上没有人来输入密码。这时常见的写法是把令牌拼进地址,例如https://<登录名>:<令牌>@git.anguskit.com/...。不要这样做:这个地址会被写进克隆出来的.git/config,还容易出现在构建日志里。

改用请求头传令牌。先把令牌放进 CI 的密钥变量,例如ANGUSGIT_TOKEN,然后:

git-chttp.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. 令牌过期了,或者要换一把

访问令牌列表里,每把令牌都显示状态(活跃、已过期或已吊销)、最后使用时间、使用次数和过期于的日期。

令牌过期或被吊销后,用它克隆或拉取会认证失败。按下面三步换一把:

  1. 按第 2 节重新生成一把令牌。
  2. 清掉 Git 缓存的旧令牌,否则 Git 会一直拿旧的去试:
printf"protocol=https\nhost=git.anguskit.com\n\n"|gitcredential reject
  1. 再执行一次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。

参考文章

  • AngusGit 手册:组织与权限(SSH 密钥、访问令牌)
  • AngusGit 手册:仓库(克隆地址)
  • 自建 Git 之后怎么推代码:配 SSH 或 HTTPS,完成第一次 push
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进