Git拉取 - 污点过滤器LFS失败

33
我试图从Github上拉取代码到我们的服务器上(git pull origin master)。
这之前是可以的。但现在,我收到了以下错误信息:
$ git pull origin master
From github.com:org-name/repo-name
 * branch              master     -> FETCH_HEAD
Updating 8024663e..e458e5c1
fatal: path/to/file.msi: smudge filter lfs failed

我使用 GIT_TRACE=1 运行了相同的命令:

$ GIT_TRACE=1 git pull origin master
19:25:26.331064 git.c:371               trace: built-in: git 'pull' 'origin' 'master'
19:25:26.333947 run-command.c:350       trace: run_command: 'fetch' '--update-head-ok' 'origin' 'master'
19:25:26.334661 exec_cmd.c:116          trace: exec: 'git' 'fetch' '--update-head-ok' 'origin' 'master'
19:25:26.337625 git.c:371               trace: built-in: git 'fetch' '--update-head-ok' 'origin' 'master'
19:25:26.344457 run-command.c:350       trace: run_command: 'ssh' 'git@github.com' 'git-upload-pack '\''org-name/repo-name.git'\'''
19:25:26.925565 run-command.c:350       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
19:25:26.937016 run-command.c:350       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
19:25:26.937833 exec_cmd.c:116          trace: exec: 'git' 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
19:25:26.941292 git.c:371               trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
From github.com:org-name/repo-name
 * branch              master     -> FETCH_HEAD
19:25:26.994717 run-command.c:1130      run_processes_parallel: preparing to run up to 1 tasks
19:25:26.994880 run-command.c:1162      run_processes_parallel: done
19:25:26.995780 run-command.c:350       trace: run_command: 'gc' '--auto'
19:25:26.996735 exec_cmd.c:116          trace: exec: 'git' 'gc' '--auto'
19:25:27.000596 git.c:371               trace: built-in: git 'gc' '--auto'
19:25:27.002716 run-command.c:350       trace: run_command: 'merge' 'FETCH_HEAD'
19:25:27.003445 exec_cmd.c:116          trace: exec: 'git' 'merge' 'FETCH_HEAD'
19:25:27.006078 git.c:371               trace: built-in: git 'merge' 'FETCH_HEAD'
Updating 8024663e..e458e5c1
19:25:27.420945 run-command.c:350       trace: run_command: 'git-lfs filter-process'
19:25:27.470865 run-command.c:209       trace: exec: '/bin/sh' '-c' 'git-lfs filter-process' 'git-lfs filter-process'
trace git-lfs: run_command: 'git' version
trace git-lfs: run_command: 'git' config -l
trace git-lfs: Initialize filter-process
trace git-lfs: Read filter-process request.
trace git-lfs: Read filter-process request.
fatal: path/to/file.msi: smudge filter lfs failed
19:25:27.998635 run-command.c:42        trace: run_command: running exit handler for pid 18022

我验证了我的ssh凭证是正确的:

$ ssh -T git@github.com
Hi user-name! You've successfully authenticated, but GitHub does not provide shell access.

实际上,我知道凭据是正确的,因为 pull 命令会下载 .gitattributes 文件(以及我所做的其他小文件更改):

 file.msi filter=lfs diff=lfs merge=lfs -text

我验证了Git LFS似乎已经正确配置:

$ git config -l
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
...

我发现了这个Github issue,并尝试了其中的三个步骤:
$ echo "protocol=https\nhost=github.com" | git credential fill
$ echo "protocol=https\nhost=github.com" | git credential fill | git credential reject
$ echo "protocol=https\nhost=github.com" | git credential fill | git credential approve

第一步要求我输入用户名。因此,正如所说的那样,似乎 Git LFS 没有缓存任何内容。
我对 Git LFS 没有太多经验,坦率地说,我已经不知道如何解决这个问题了。
最近我采取了两个可能会破坏某些东西的行动:
1. 我从我们的存储库中删除了一个用户。服务器的 ssh 密钥属于该用户。我们添加了一个部署密钥,但我读到 Git LFS 不支持部署密钥(尽管最近似乎已经添加了支持)。因此,我们切换到用户密钥。两个密钥都通过了 ssh -T git@github.com 测试进行了确认。但是,也许存在身份验证问题?
2. 我将存储库拉入了一个没有 Git LFS 的服务器上。当时我没有意识到,但文件成功传输到目标服务器。但是,也许这破坏了存储库?
非常感谢您提供的任何帮助。
抱歉如果我的匿名化造成了困惑。我用 X.X.X.X 替换了我们实际的 IP 地址;用 org-name 替换了我们的组织名称;用 repo-name 替换了我们的仓库名称;用 user-name 替换了我们的 Github 用户名;用 file.msi 替换了文件名,以及其他一些内容。
编辑于 2017 年 5 月 16 日:添加了语言,明确说明它曾经可以工作……而我现在破坏了它。
3个回答

46
在我的情况下,通过SSH验证的存储库已经从另一个客户端更新为使用LFS,并且在我的Git-LFS端不知道SSH远程URL。为了修复这个问题,我采取了以下步骤:
将配置在remote.origin.urlorigin的推送URL)中的URL复制到lfs.url(LFS使用的URL)中:
$ git config lfs.url $(git config remote.origin.url)

(如果你的远程仓库不叫做origin,请将其改为你的远程仓库名称。)
然后运行。
$ git config lfs.url

展示URL并确认它确实包含一个SSH URL,而不是一些HTTP/HTTPS URL。
然后你可以
$ git pull

完成。
如果你之前搞砸了,而且`main`和`origin/main`在某种程度上发生了分歧(就像我遇到的情况一样),那么你可能需要执行`git checkout -fB main origin/main`(这不会询问,而是覆盖本地版本的`main`分支,所以请小心并谨慎执行!)。
另请参阅:https://github.com/git-lfs/git-lfs/issues/2661#issuecomment-335903332

1
感谢@grandchild的回答。我们最终花了一两个小时使用scp将二进制文件移动到服务器上,并正在努力实现像S3这样的文件服务器系统,而不是Git LFS。我会标记这个作为答案,因为它解决了你遇到的类似问题。我有点绕了哈哈。感谢您的回答! - Jack
就是这样了!还要注意 - 如果你从另一个远程仓库拉取,请将 git config remote.origin.url 调整为 git config remote.<MY_OTHER_REMOTE>.url - Tomasz Gandor
那么我的理解是正确的,GIT LFS 不关心远程 URL,而是使用设置它的存储库的远程 URL?这是 GIT LFS 的一个 bug 还是一个 feature? - Florian Winter
@FlorianWinter 我认为问题更多的是,如果在存储库没有启用 LFS 时克隆了存储库,则 Git LFS 在拉取时根本没有 URL。如果您使用已启用 LFS 的存储库进行克隆,则我想上面解释的配置设置将完全相同,只是自动设置。 - grandchild
这种情况发生在我刚克隆存储库的时候。在我克隆之前,其他人已经长时间设置了GIT LFS。@grandchild 但是,如果我仍然可以重现它/有时间这样做,我会自己进行更多的研究。谢谢。 - Florian Winter

1
在我这种情况下,我需要在遵循@grandchild答案提供的指示后添加一个步骤。正如@grandchild所解释的那样,我的远程git仓库最近从原来的https协议更改为使用ssh协议。在我的git配置中,没有设置git配置“http.sslverify”。如果缺少默认值,则应该为true。这会导致出现错误“smudge filter lfs failed”。一旦我将其设置为false:

$ git config http.sslverify false

它可以无错误地工作。

2
这将跳过SSL证书验证,一般来说这不是一个好主意。您应该调查为什么证书检查首次失败。当使用自签名证书(这可能是禁用验证的唯一有效短期借口)时,请参阅https://git-scm.com/docs/git-config#EXAMPLES(在该部分末尾)。您可以仅针对一个URL禁用检查。 - grandchild
1
@grandchild 正如我在评论中提到的那样,我们远程仓库最近将连接协议从https更改为ssh,这导致了失败。由于http.sslverify不再受支持,因此更改导致了失败。 - Feng Yang

1
对我来说,解决方案似乎是将Git LFS更新到最新版本。

1
最新版本是什么? - SwissCodeMen
目前(我安装的那个)是3.3.0版(请参见https://git-lfs.com/)。我不确定我来自哪个版本。 - Immortaly007

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