我正在尝试以编程方式克隆 git 存储库。我的 ASP.NET MVC 应用程序正在创建并启动一个进程。处理进程的代码工作正常,但是当尝试使用本地 TFS PAT 克隆 git 存储库时,身份验证失败。我无法使用 NTLM 或要求用户输入凭据。我可以确认我的 C# 代码处理创建进程以编程方式使用 git bash shell 可以正常工作,因为我在本地计算机上没有问题,但在 IIS 上的生产中出现了问题。我尝试过以下两种方法。
方法1:git克隆http://anyusername:PAT@tfs2017:8080/tfs/DefaultCollection/_git/Git%20Repository
PAT 是我为我的用户生成的令牌。我也尝试过用base64对其进行编码。
方法 2:按照 MS 社交论坛上的一个人的建议。
git -c http.extraheader="AUTHORIZATION:bearer {base64encodedPAT}"克隆{url}
如果您有 PAT,则不需要密码:PAT 将充当您的用户名。
看看以下是否有效:
git clone http://PAT@tfs2017:8080/tfs/DefaultCollection/_git/Git%20Repository
读完MS的文章后我有点困惑。在尝试了一些方法之后,我终于能够使用我的 PAT 来对抗 TFS 和 VSTS GIT Repos。
我能够使用 PAT 克隆 GIT 存储库的唯一方法是在 GIT 命令行中设置
http.extraheader
。HTTPS
,令牌必须采用 BASE64 编码,包括(虚构的)用户名。
示例:
git -c http.extraheader="AUTHORIZATION: Basic TXlHaXRTeW5jVXNlcjo2bHFqNXJkcHEzdXBxZWVmd2o3bDduZXN5NTR3d3gxNHFobDVlanl5NTVkb2g0M3d4YzRh" clone https://tfs.address/tfs/Collection/Project/_git/RepoName
使用基本代币BASE64编码:
TXlHaXRTeW5jVXNlcjo2bHFqNXJkcHEzdXBxZWVmd2o3bDduZXN5NTR3d3gxNHFobDVlanl5NTVkb2g0M3d4YzRh
基本令牌BASE64解码:
MyGitSync用户:
6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a
代币由
<fictional user name>:<PAT from a user with rights in the project>
构成
在此示例中:
虚构用户名:MyGitSyncUser 使用的 PAT:
6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a
PAT范围:
Code (Read)
TFS/VSTS 目前不接受“
AUTHORIZATION: Bearer
”标头:(
也许这会对在 TFS/VSTS 中使用 PAT 的人有所帮助。
注意:基本身份验证需要 HTTPS!
只是添加我的 2c,因为我花了几个小时在这上面。
我从 DevOps 生成了 PAT 并复制了克隆 URL,但我一直收到“未找到存储库”的消息
GIT clone https://<PAT>@dev.azure.com/Organization/My%20Project/_git/MyRepo
注意项目中有一个空格,并且是 URLEncoded
这在 DOS 中不起作用 - 它解决了
My0Project
你需要像这样双重转义:
GIT clone https://<PAT>@dev.azure.com/Organization/My%%20Project/_git/MyRepo
您可以通过以编程方式将令牌添加到计算机来使用 CredentialManager,与 CredentialManager 的操作方式相同。
在 Windows 上,我使用
cmdkey
工具,如下所示:
cmdkey /generic:"git:https://yourdomain.visualstudio.com" /user:"Personal Access Token" /pass:"yourtokenhere"
在 MacOS 上,在钥匙串中添加一个条目:
security add-generic-password -a "Personal Access Token" -D "Credential" -s "gcm4ml:git:https://yourdomain.visualstudio.com" -w "yourtokenhere" -A
注意:避免使用 -A,它允许任何应用程序访问它。
只要在 Git 上安装了 CredentialManager,它就应该可以工作。
感谢 Clemens 上面的出色回答,但我想用我在 TFS 服务器上的经验更新他的回答。
TFS 服务器(本地,而不是 Azure DevOps)仅在用户名字段为空时才会获取令牌,这意味着(非 Base64 编码)基本授权的格式为“:TFS_TOKEN”。
我尝试将 GIT_ASKPASS 与返回空用户名和令牌的脚本一起使用,但它不起作用。当我开始使用wireshark查看时,我发现我的git CLI选择使用NTLM而不是基本身份验证。可能有一种方法可以告诉 git 使用 Basic 而不是 NTLM,但我找不到它。
这个问题(以及克莱门斯的回答)让我采取了这种方法:
$ TFS_TOKEN="...."
$ TFS_AUTH=$(echo -n ":${TFS_TOKEN}" | base64)
$ git clone -c http.extraheader="Authorization: Basic ${TFS_AUTH}" https://...
对于 github,请使用以下格式(必须使用 https://)
git 克隆 https://[PAT]@github.com/[你的仓库链接].git