问题:
有没有办法将 GitHub 细粒度 PAT 的优点与git pullHTTPS 的简单性结合起来?如果是这样,那又如何呢?
背景
GitHub 有“经典”和“细粒度”个人访问令牌(PAT):
转到“设置”>“开发者设置”即可查看这些内容。
我一直在使用经典的 PAT 通过 HTTPS 运行git pull命令,以从 GitHub 提取最新的提交:
git pull https://${token}@github.com/${owner}/${repo}.git
Run Code Online (Sandbox Code Playgroud)
此操作无需提示输入密码(我将 PAT 的有效期设置得相当短)。
我不能只是(天真地)用新的细粒度令牌替换git pull命令中的经典令牌。它提示我输入密码。(我认为它被视为用户 ID。)
细粒度的 PAT 当然可以与 GitHub REST API配合使用。如果我有提交 SHA,我可以使用 API 来获取提交。但这是相当低级的git pull,我不想“重新实现很多 Git 功能”(参考)。
细粒度的 PAT 受到欢迎,因为它们能够锁定对特定存储库和特定功能的访问。git pull但是它们如何(如果有的话)直接与命令一起使用呢?
我正在使用 Git v2.38.1(当前最新版本)。
and*_*mes 20
我使用了 @bk2204 的答案,并采取了以下步骤,从“URL 中的令牌”方法(不好!)转向“商店中的凭证”方法(更好!)。
使用较新的 GitHub 细粒度令牌来完成此操作没有任何问题。
我想记录具体步骤 - 就在这里。
在 GitHub 中:
创建新的 PAT:设置 > 开发人员设置 > 细粒度令牌。
授予此令牌对一个存储库的访问权限。
授予一项存储库权限:内容(只读)。
这也会自动设置元数据(只读)权限。
在我的服务器上:
这是一个无头 Linux 盒子。我没有与 Git 集成的任何第 3 方密钥存储(例如, no libsecret)。
我选择使用 Git 提供的store. 尽管这以明文形式存储凭据,但它的安全性(在我看来)并不比存储在.ssh. 这对于我的情况来说是可以接受的 - 并且比我一直在做的(将令牌直接放置在命令的 URL 中pull)要好得多。
具体的一次性设置命令:
git config --global credential.helper store
git config --global credential.useHttpPath true
Run Code Online (Sandbox Code Playgroud)
这会在我的全局文件中创建以下内容.gitconfig:
[credential]
helper = store
useHttpPath = true
Run Code Online (Sandbox Code Playgroud)
然后,在我的 Git 存储库目录中,我运行一个简单的命令pull:
git pull https://github.com/${owner}/${repo}.git
Run Code Online (Sandbox Code Playgroud)
作为一次性步骤,我必须根据提示手动提供我的用户 ID 和 PAT。
这些凭据存储在一个新的(对我来说).git-credentials文件中。凭证的格式为:
https://<user ID>:<fine-grained PAT>@github.com/<owner>/<repo>.git
Run Code Online (Sandbox Code Playgroud)
我可以根据需要对更多存储库重复此过程,每个存储库都有自己的 PAT。
当我执行后续git pull命令时,将使用商店中相关的特定于 URL 的凭据 - 不需要命令行交互。
您通常希望避免在 URL 中使用令牌。虽然这在从命令行测试事物时很方便,但它不是很安全,并且 Git 正在尝试让执行此操作变得更加困难。
如果您想存储此信息,请使用凭据助手。您可以通过设置为 true 在凭证帮助程序中使用每个 URL 的凭证credential.usehttppath。(您也可以使用类似的名称credential.https://github.com.usehttppath。)然后,当系统提示您输入用户名时,请指定您的常规用户名,并指定密码的令牌。
如果您需要通过 shell 脚本或其他非交互式使用来操作某些内容,Git FAQ 提到如何使用简单的凭据帮助程序从环境中读取。再次,将令牌指定为密码,而不是用户名。