【问题标题】:Git pull - smudge filter lfs failedGit pull - 涂抹过滤器 lfs 失败
【发布时间】:2017-05-15 22:42:47
【问题描述】:

我正在尝试将代码从 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 didn't support deployment keys(尽管最近似乎添加了支持)。所以,我们切换到用户密钥。两个密钥都通过ssh -T git@github.com 测试得到确认。不过,也许存在身份验证问题?
  2. 我将存储库拉到没有 Git LFS 的服务器上。我当时没有意识到,但文件传输到目标服务器很好。但是,也许这破坏了存储库中的某些内容?

您可以提供任何帮助,我们将不胜感激。

PS - 如果我的匿名化造成混乱,我很抱歉。我用X.X.X.X替换了我们的实际IP地址;我们的组织名称与org-name;我们的仓库名称为repo-name;我们的 Github 用户,user-name;带有file.msi 的文件名;而且,还有一些事情。

编辑 2017 年 5 月 16 日:添加了语言以明确它曾经可以工作......并且我打破了它。

【问题讨论】:

    标签: git github git-lfs


    【解决方案1】:

    就我而言,经过 SSH 身份验证的存储库已更新为使用来自另一个客户端的 LFS,而在我这边 Git-LFS 不知道 SSH 远程 URL。我做了以下修复:

    remote.origin.url中配置的URL(origin的推送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
    

    完成。


    如果你之前搞砸了,masterorgin/master 以某种方式出现分歧,就像我的情况一样,那么你可能需要 git checkout -fB master origin/master(这不问和 覆盖主分支的本地版本,所以小心并小心执行!)。

    另请参阅:https://github.com/git-lfs/git-lfs/issues/2661#issuecomment-335903332

    【讨论】:

    • 感谢@grandchild 的回答。我们最终只花了一两个小时使用scp 将二进制文件移动到服务器,并且我们正在努力实现一个文件服务器系统,比如 S3,而不是 Git LFS。我将继续并将其标记为答案,因为它为您解决了类似的问题。我有点绕着它哈哈。感谢您的回答!
    • 就是这样!另请注意 - 如果您从不同的遥控器拉动,请将 git config remote.origin.url 调整为 git config remote.<MY_OTHER_REMOTE>.url
    • 那么我是否正确理解 GIT LFS 不关心远程 URL 而是使用设置它的存储库的远程 URL?这是 GIT LFS 的错误还是功能?
    • @FlorianWinter 我认为如果在存储库未启用 LFS 时克隆了存储库,则 Git LFS 只是 没有 拉取 URL。如果你克隆一个已经启用 LFS 的存储库,我想上面解释的配置设置将被设置为相同的,只是自动的。
    • 这发生在我刚克隆的存储库中。在我克隆它之前很久,其他人就在它上面设置了 GIT LFS。 @grandchild 但是,如果我仍然可以复制它/有时间这样做,我会自己做更多的研究。谢谢。
    【解决方案2】:

    在我的情况下,我必须按照@grandchild 的答案提供的说明再添加一个步骤。正如@grandchild 所解释的,我的远程 git 存储库最近已更改为使用来自原始 https 的协议 ssh。在我的 git 配置中,最初没有设置 git 配置“http.sslverify”。如果缺少,我相信默认值是 true。它导致错误“涂抹过滤器 lfs 失败”。一旦我将其设置为 false

    $ git config http.sslverify false

    它可以正常工作。

    【讨论】:

    • 这会跳过 SSL 证书验证,这通常不是一个好主意。您应该首先调查证书检查失败的原因。当使用自签名证书(这可能是禁用验证的唯一有效的短期借口)时,请查看git-scm.com/docs/git-config#EXAMPLES(接近该部分的末尾)。您可以禁用仅对一个 URL 的检查。
    • @grandchild 正如我在评论中提到的,失败是由于最近在我们的远程存储库中更改连接协议(从 https 到 ssh)引起的。该更改使 http.sslverify 失败,因为我们的远程存储库不再支持它。
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多