Git错误:遇到应该是指针的7个文件,但没有

Kat*_* Zz 30 git git-lfs

如果标记为已修改的暂存文件,如何清理repo

git reset --hard

我明白了

遇到了应该是指针的7个文件,但不是:

git clean -fdx

也没有帮助

kar*_*yon 35

从 git lfs 2.5.0 开始,有一个新命令可以使这更容易(docs):

git lfs migrate import --no-rewrite "broken file.jpg" "another broken file.png" ...
Run Code Online (Sandbox Code Playgroud)

这将“迁移”文件到 git lfs ,它应该在 lfs 中.gitattributes,但目前不是(这是您的错误消息的原因)。

--no-rewrite 防止 git 将此应用于旧提交,而是创建一个新提交。

使用-m "commitmessage"设置为犯commitmessage。

  • 这应该是排名最高的答案。作品! (6认同)
  • 这个解决方案对我有用。我最初是从这篇博客文章中找到它的:https://tech-notes.maxmasnick.com/fixing-files-that-should-have-been-pointers-in-lfs-but-werent (3认同)
  • 同意@BrianCraig 的观点。截至 **2021** 应该是最佳答案 (3认同)

Ria*_*son 34

我对git-LFS存储的一些文件有这个确切的错误并解决了它,就像我解决了一个线性诱导的borked索引一样.

清除缓存并执行硬重置:

git rm --cached -r .
git reset --hard
Run Code Online (Sandbox Code Playgroud)

这是显著比新鲜克隆我更快,因为在我的回购巨大的git-LFS文件.

  • 这对我不起作用,但 [AnsarAdimu 的答案](/sf/answers/3836295711/) 的第二个代码块起作用了。没有尝试他们答案的第一个代码块,因为卸载 git lfs 似乎有点多。 (4认同)
  • 这对我来说也不起作用。 (2认同)

Ans*_*imu 34

就像Travis Heeter在回答中提到的那样,请尝试以下命令序列:

git lfs uninstall
git reset --hard
git lfs install
git lfs pull
Run Code Online (Sandbox Code Playgroud)

如果这不起作用(因为这对我不起作用),则可能会发生以下情况:

git rm --cached -r .
git reset --hard
git rm .gitattributes
git reset .
git checkout .
Run Code Online (Sandbox Code Playgroud)

这对我有用!

  • 为我工作,但在 Windows 上,必须使用“PowerShell”而不是“git bash” (3认同)
  • 这对我不起作用。“git reset --hard”,任一路径上的第二步,失败并显示与提问者相同的消息,所以我无法通过该步骤 (3认同)
  • 在跨不同的分支解决这个问题并做一些诸如制作临时分支并将问题文件提交给这些分支之后,我仍然发现我留下了一个分支,而 Unity 资产文件被卡在了后面。这种方法非常有效。 (2认同)
  • 我需要与另一个分支进行合并,但无法摆脱那些非指针文件。快把我逼疯了……所以,我做了一个 `git lfs uninstall`、`git reset hard <commit>`、`git merge <branch>`、`git lfs install` 和 `git lfs pull`。最后 :)。谢谢。 (2认同)
  • Ops,我之前的评论应该说`git reset --hard`...过了一段时间后无法在Stackoverflow中进行编辑,叹息... (2认同)

Jor*_*dan 34

问题来自标记为由 git LFS 在 git LFS 跟踪的文件类型.gitattributes和一些匹配文件之间的不匹配,这些文件已经在传统的非 LFS 版本控制下。

所以这里最简单的解决方法是.gitattributes暂时删除文件:

git rm .gitattributes
git reset .
git checkout .
Run Code Online (Sandbox Code Playgroud)

之后,您可以结帐任何其他分支。

还有一个建议:在向 git LFS 添加新文件类型时,不要通过修改.gitattributes而是手动执行此操作,例如通过运行:

git lfs track PATTERN
Run Code Online (Sandbox Code Playgroud)

其中 PATTERN 是匹配文件的模式,例如 *.so

这样,所有与新跟踪模式匹配的非 LFS 版本化文件都将被标记为脏文件,并且可以简单地添加,即转换为 git LFS(文件指针)。

  • “*暂时删除 .gitattributes 文件*”您能解释一下这三个命令是如何做到这一点的吗?它似乎删除`.gitattributes`并暂存删除,然后撤消暂存,然后撤消删除。最终结果似乎什么也没有。有一些“git-lfs”魔法吗? (5认同)
  • 我可以确认这几乎总是适用于 Git 2.18.0、2.26.2 和 2.27.0。如果第一次尝试不起作用,请删除有问题的文件并再次运行上述命令。 (2认同)

Tra*_*ter 22

这些解决方案都不适合我,但我拼凑了一些来源,最终解决了所有这些问题。

  1. 推送您不想丢失的任何更改

    如果可以... 如果不能,或者如果您不关心您的更改,请按。

  2. 停止一切

    SourceTree、任何服务器、文件浏览器和浏览器。有时,如果它在其他地方使用,这些东西将不起作用。如有疑问,请停止它 - 这样做最好是矫枉过正。

    另外,进入任务管理器,强制退出任何bash.exe进程。Git Bash 倾向于在您关闭窗口后保持文件打开。

  3. 打开命令窗口(或终端)

    cd 到您的本地仓库。

  4. 卸载 lfs

    > git lfs uninstall

    然后它会说:

    Hooks for this repository have been removed.
    Global Git LFS configuration has been removed.
    
    Run Code Online (Sandbox Code Playgroud)
  5. 重启

    > git reset --hard

    它可能会经历很多输出......

  6. 重新安装 lfs

    > git lfs install

    这可能再次说明它找到了应该是指针但不是指针的文件。没关系,继续!

  7. 拉用 lfs

    > git lfs pull

    希望用 lfs 拉动会覆盖那些无聊的文件。

    我的一些消息来源说此时他们的回购再次工作,但不是我个人。如果需要,您可以打开 SourceTree 或其他任何内容进行检查,但如果它不起作用,您可能必须从顶部开始。

  8. 迁移

    这里的核心问题是lfs,不是下载像音频、视频、图像这样的大文件——任何大于 1Mb 的文件——它只是在服务器上指向它们。如果你有一堆大文件,这很有用,你没有拉下所有的东西。所以你的本地仓库更小更灵活。但是,在我不确定的情况下,似乎有可能损坏指针。我确信这是一个 lfs 人意识到并正在努力解决的问题,但现在我们必须自己解决。

    到目前为止我们所做的是

    • 卸载 lfs
    • 删除一切
    • 重新安装 lfs
    • 拉一切

    所以现在我们的文件夹中有所有这些东西,要么是文件要么是指向文件的指针lfs需要弄清楚是否有任何文件应该是指针,反之亦然。希望通过执行上述步骤,我们删除了损坏的指针。因此,我们将执行migrate启动通过 repo 上文件的过程,如果它们大于 1Mb,lfs 将用指针替换它们。

    > git lfs migrate

  9. 更多错误

    在这一点上,其他人停下来说他们又开始工作了,但我不是。我有一个错误:

    git rev-list 中的错误...退出状态 128 致命:错误修订版 '... v1.0.0'

    @guneyozsan 在github 帮助页面上,将最后一块拼图发布到了拼图上,尽管它没有解决他的问题。

    > git lfs migrate info --include-ref=v1.0.0

    请注意,版本与出错的版本匹配 - v1.0.0。您将需要替换v1.0.0为您在错误中得到的任何版本。

    我还没有找到有关为什么会发生此错误的来源,但我的猜测是migrate本地存储库上生成的 lfs 版本号与源版本不匹配。对我来说,所有这一切都是在 SourceTree 在推送过程中崩溃时开始的,我强迫机器重新启动,当发生这种情况时,lfs 不知道如何处理它,所以它只是卡在这个试图更新的循环中,但是它无法读取损坏的数据。因此需要冗长的故障排除。

  10. 藏匿和拉动

当您打开 SourceTree 时,您可能会看到它想要重新添加所有文件。不要那样做。藏起来,然后拉

繁荣,恐怖有望结束。如果没有,这个git hub 页面这个页面可能会帮助你更多,但这对我有用。


小智 19

跑步

git add --renormalize .
Run Code Online (Sandbox Code Playgroud)

并提交这些更改。即使另一个用户在另一个分支上执行相同的操作也是安全的,因为 LFS 指针是从文件的哈希派生的。它还可能捕获一些行结尾错误的文件。

  • 我不知道为什么这被否决了,这正是正确使用的命令,并且它对我有用(只是代替“.”传递需要修复的文件的路径以加快进程)。 (3认同)

son*_*nny 7

导致此错误的一个可能原因是与 git LFS 相关的更改.gitattributes影响了存储库中已添加的文件。

(我不确定重现的确切步骤,但当我触及新受 .gitattributes 影响的文件时,似乎出现了问题,该文件之前作为非 LFS 文件提交,现在应该是 LFS 文件。切换分支似乎使问题变得更加严重,或者至少在问题解决之前无法切换分支。)

在这种情况下,我使用了以下步骤来防止此错误重复发生


  1. 按照此处的其他答案之一修复您所在分支的问题(例如,清除缓存并重置。我发现BheeMa 的答案很有效。)
  2. 转到您的主分支,并确保没有任何可提交的内容git status
  3. 强制 git 重新检查并“重新应用”git 属性更改

来自Ratata Tata如何使更改.gitattributes生效中的回答)

 git rm --cached -r .
 git add -A
Run Code Online (Sandbox Code Playgroud)

警告:确保在步骤 2 中没有任何需要提交的内容,因为上述步骤将添加之前未进行版本控制的任何文件

  1. 验证结果git status(它应该只修改相关文件以成为 LFS 指针,即可能导致“遇到应该是指针的文件”错误的文件)并提交更改
  2. (如果可能的话,将此修复合并/变基到所有其他分支。否则,切换到这些分支时可能会再次弹出此错误。请注意,为了安全起见,可能需要按照步骤 1 对每个分支重复初始修复,尽管只提交受影响的文件就可以了。)


sly*_*fox 6

当您执行检出包含应该由LFS跟踪的文件时,可能会发生这种情况,.gitattributes但文件是以某种方式直接提交的。您很可能有另一个程序来管理您的存储库,例如git GUI或IDE。

这可能令人沮丧,因为这些文件无处不在并且阻止您进行检出。一旦您保存更改,它们就会返回!如果您陷入这种情况,快速解决方案是将这些更改提交到临时分支上,以便您可以再次签出。

要真正解决此问题,请确保已将文件作为LFS指针提交。这应该和使用一样简单git addgit lfs status提交前检查使用的工作。git lfs ls-files将显示LFS正在管理哪些文件。

git lfs status具有误导性,因为它读取的Git LFS objects to be committed是真正列出所有更改的时间。您希望被LFS跟踪的文件应读取类似(LFS: c9e4f4a)(Git: c9e4f4a -> LFS: c9e4f4a)不这样的内容(Git: c9e4f4a)

举例来说,在通过Xcode 9.2添加图像资产时,我发现这是一个问题,我在其中添加了自动添加的“ CalendarChecked.png”。

$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png

$ git lfs status

Git LFS objects to be committed:

    Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (Git: c9e4f4a)

Git LFS objects not staged for commit:

    Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (File: c9e4f4a)

$ git add Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png`
$ git lfs status

Git LFS objects to be committed:

    Empty/Empty/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (LFS: c9e4f4a)

Git LFS objects not staged for commit:

$
Run Code Online (Sandbox Code Playgroud)


Fel*_*lix 6

确保您git lfs安装了 2.5 或更高版本(在此处下载)。

检查您使用的是git lfs下载的版本(对我来说是 2.7.7):

>git lfs version
git-lfs/2.7.2
Run Code Online (Sandbox Code Playgroud)

跑:

git lfs migrate import --fixup --everything

拉你的分支并修复任何合并冲突。

在此github 评论中找到。

  • 这是正确的答案,其他一切对我来说都失败了。 (2认同)

Pel*_*let 5

接受的答案对我有用,但只有当我手动键入命令时它才有效,我在每个命令之间放置睡眠,现在它作为 bash 脚本工作:

git rm --cached -r .
sleep 1
git reset --hard
sleep 1
git rm .gitattributes
sleep 1
git reset .
sleep 1
git checkout .
Run Code Online (Sandbox Code Playgroud)


Flo*_*ter 5

这只是再一次展示了GIT-LFS是什么狗屎。

如果出现以下情况,您可能会陷入这种情况:

  1. 文件包含在LFS 中common-base-branch但不包含在 LFS 中
  2. lfs-branch在基于 的分支中common-base-branch,文件被移动到 LFS
  3. non-lfs-branch在另一个同样基于 的分支中common-base-branch,该文件被修改。

或者:

  1. 该文件不包含在common-base-branch
  2. lfs-branch在基于 的分支中common-base-branch,文件被添加到 LFS
  3. non-lfs-branch在另一个基于 的分支中common-base-branch,该文件被添加(但没有添加到 LFS.

在这两种情况下,当您尝试合并non-lfs-branch到时lfs-branch,您都会收到这种错误。

你可能会问为什么这首先会发生,但答案是很多软件是由多个人开发的(这就是为什么你首先拥有像 GIT 这样的版本控制系统),而人们不这样做不总是互相交谈,或者 LFS 是在项目历史的某个特性分支中稍后引入的,而“正常”开发仍在其他分支中继续进行。

这是合法的合并冲突情况,而不是错误或损坏的工作目录或任何东西(正如其他一些答案所暗示的那样)。GIT-LFS 只是处理得很差。

您现在要做的是确保冲突文件的正确版本进入 GIT-LFS,因此您可能想要选择这个问题的答案,它的作用就是......(TODO:插入至少一个链接有效的答案)