Git LFS使用与Git客户端不同的身份验证逻辑吗?

3
我们使用本地的Azure DevOps,并且刚开始试用Git LFS。我已经安装了最新的客户端(3.0.2),并与我的git(2.31.1.windows.1,由Visual Studio安装)一起使用,当从具有LFS文件的DevOps克隆Git存储库时,一切都看起来很好。
但是,我的本地存储库只有对LFS文件的引用,当尝试运行像git lfs pull(或fetch,或推送新的LFS跟踪文件)这样的命令时,我会收到与http://<server>:8080/tfs/<collection>/<project>/_git/<repo>.git/info/lfs相关的身份验证错误-即我们git存储库URL的子路径。
谷歌搜索显示其他人有类似的问题,但不清楚发生了什么,或者为什么,或者如何解决它。我不明白这是否是DevOps实现问题,还是我这边的本地客户端问题。
我确实看到有关Git LFS不使用与Git相同的凭据或身份验证类型,或者可能在不同的位置查找它们的讨论-请注意,我们在本地使用HTTP而不是HTTPS,也许这是一个因素?

3
Git LFS需要连接到两个独立的服务器:一个用于大文件,另一个用于origin或您为主机指定的其他名称(例如GitHub),该主机存储Git仓库。(大文件不在Git仓库中,这就是Git-LFS规避大小限制的方式。)每个服务器 - LFS服务器和托管服务器 - 都有自己的身份验证方法和要求。无论使用哪个LFS服务器和Git服务器,这都是正确的:它们是两个独立的服务器,即使它们位于同一主机上。(但如果它们确实位于同一主机上,可能有些事情会简化。) - torek
@torek 这完全有道理,唯一的问题是我们看不到应该如何提供LFS身份验证。我们对LFS是全新的,因此可能非常简单,但DevOps甚至似乎没有广告展示LFS文件存储在哪里,直到我们收到这个错误消息。 - Mr. Boy
我自己并没有使用过Git-LFS(除了一些非常简短的实验之外,当时我们决定不使用它),所以我也不太确定。 - torek
1个回答

5
Git LFS使用的HTTP和TLS库与Git中的不同。 Git使用libcurl,而Git LFS使用Go HTTP库。 因此,支持的身份验证逻辑不同,尽管两个程序都将使用Git凭据助手和其他凭据查找逻辑。
由于您提到Azure DevOps,我猜测您正在使用NTLM。 在3.0中,Git LFS删除了NTLM,因为它存在已知的错误并且没有人有兴趣修复它,因为它使用自1995年以来已知不安全的加密技术。 Azure DevOps是唯一已知使用NTLM的主要站点,Git LFS维护者询问他们是否愿意参与协助维护它,并且他们拒绝了。
NTLM可以通过NTLM身份验证方案或Negotiate方案中的一种进行处理。 后者也被Kerberos使用,Git和Git LFS都支持它,而且它是安全的。 目前,如果您已经设置了NTLM以使用Negotiate,Git LFS就简单地无法工作,因为它会优先考虑Negotiate而不是Basic。 预计在本月或下个月发布的即将推出的3.1版本中,Git LFS将在Negotiate失败时回退到Basic,因此即使在实例上启用了NTLM,您也可以工作。
我强烈建议每个人都摆脱NTLM,因为它太不安全了。 现在真的没有合理的理由再使用它了:即使Microsoft也告诉您关闭它。 如果您关闭实例上的NTLM或切换到Kerberos,应该只需正常工作。 否则,您需要等待Git LFS 3.1或在配置中显式设置身份验证方法为basic

谢谢,这给了我很多启发。我认为这是一个很好的参考资料,可以添加在这里:https://github.com/git-lfs/git-lfs/issues/4247。你知道如何/在哪里可以在客户端级别上更改以不使用`negotiate`吗? - Mr. Boy
您可以尝试使用手册页面中的 lfs.<url>.access 语法(https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-config.5.ronn)。如果这不起作用,您将不得不关闭NTLM(无论如何都应该这样做)或等待Git LFS 3.1版本。 - bk2204
既然 Git LFS 3.1.x(甚至是 3.2.x)已经发布了,最佳处理方式是什么? - Dennis
您可以在实例上切换到Kerberos。这是Azure DevOps推荐的做法。 - bk2204

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接