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

时间:2017-10-12 08:09:49

标签: git git-lfs

如果标记为已修改的分段文件

,如何清理repo

之后

  

git reset --hard

我得到了

  

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

     

git clean -fdx

也没有帮助

16 个答案:

答案 0 :(得分:17)

对于使用git-LFS和solved it the same way I've solved a linending induced borked index 存储的某些文件,我确实有这个错误。

清除缓存并进行硬重置:

shinyjs::some_function()

由于回购中巨大的git-LFS文件,对我来说,这比新克隆快

答案 1 :(得分:14)

像他的答案中提到的 Travis Heeter ,请尝试以下命令序列:

array_map

git lfs uninstall

git reset --hard

git lfs install

如果这不起作用(因为这对我不起作用),则可能会发生以下黑客攻击:

尝试以下命令:

git lfs pull

git rm --cached -r .

git reset --hard

git rm .gitattributes

git reset .

这对我有用!

答案 2 :(得分:9)

问题来自.gitattributes中标记为由git LFS跟踪的文件类型与某些已经在常规非LFS版本控制下的数学文件之间的不匹配。

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

git rm .gitattributes
git reset .
git checkout .

之后,您可以签出任何其他分支。

另一个建议:将新文件类型添加到git LFS时,最好不要通过修改.gitattributes来手工完成此操作,例如通过运行:

git lfs track PATTERN

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

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

答案 3 :(得分:4)

当您执行包含应由.gitattributes中指定的LFS跟踪的文件的结帐时,可能会发生这种情况,但不知何故,它们已被直接提交。很可能你有另一个程序来管理你的存储库,比如git GUI或IDE。

这可能令人沮丧,因为这些文件无处不在,并阻止您进行结帐。一旦你收起你的更改,他们就会回来!如果您遇到这种情况,快速解决方法是在临时分支上提交这些更改,以便您可以再次结帐。

要真正解决此问题,请确保已将文件作为LFS指针提交。这应该像使用git add一样简单。在提交之前使用git 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:

$

答案 4 :(得分:3)

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

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

    确保您位于主分支中,并且所有内容都已提交(错误文件除外)。

  2. 停止所有操作

    SourceTree,任何服务器,文件浏览器和浏览器。有时,如果在其他地方使用它,这些东西将无法工作。如有疑问,请停止使用-最好是过度杀伤。

    如果您经历了所有这些事情并且所做的更改没有被保留,请考虑重新启动计算机,从TaskManager强制停止可能影响您回购的任何事情,然后重试。

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

    在Windows上,这将是cmd或命令窗口。如果不确定,请单击Windows键,然后键入cmd。它会建议命令提示符,单击。

    cd到您的仓库。

  4. 卸载lfs

    > git lfs uninstall

    然后它会说:

    Hooks for this repository have been removed. Global Git LFS configuration has been removed.

  5. 重置

    > git reset --hard

    它将通过很多输出...

  6. 重新安装lfs

    > git lfs install

    这可能再次表示它找到了应该是指针但没有的文件。 没关系,继续前进!

  7. 拉入lfs

    > git lfs pull

    希望使用lfs拉动将覆盖令人厌烦的文件。

    我的一些消息来源说他们的回购现在又在工作,但我个人不行。您可以打开SourceTree来检查是否需要,但是如果不起作用,则可能必须从顶部开始。

  8. 迁移

    此处的核心问题是lfs通过将大文件替换为指针来跟踪大文件。 如果您是一名程序员,则类似于变量如何指向内存中的位置,而不是保持实际值。

    到目前为止,我们要做的是

    • 卸载lfs
    • 删除所有内容
    • 重新安装lfs
    • 拉动一切

    因此,现在我们的文件夹中有所有这些事物,它们是文件指向文件的指针,并且lfs需要以确定是否任何文件应该是指针,反之亦然(这是我们可怕的错误的根源-有些文件应该是指针,但不是)。因此,我们将执行migrate以启动遍历存储库中文件的过程,如果它们大于1Mb,lfs将用指针替换它们。

      

    git lfs迁移

  9. 更多恐怖

    在这一点上,其他人已经停下来并说他们又在工作,但我不是。我遇到错误:

      

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

    有一个悲剧英雄,@ guneyozsan在github help page上来了,尽管这并没有解决他的问题,他还是把这最后一篇文章发布了。即使问题已经存在两年了,他还是在我开始寻找解决方法的第十亿次之前大约两个小时发布了它。 祝福您@guneyozsan,希望您能解决您的问题。

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

    请注意版本与错误的版本-v1.0.0相匹配。

    我没有找到导致此错误的原因的资料,但是我猜测是由migrate在您的本地存储库上生成的lfs版本号与该来源版本不匹配。出于某种原因,本地lfs数据被搞砸了(对我来说,所有这些都始于在推送期间SourceTree崩溃,而我强制重新启动计算机,因此可能损坏了lfs数据),而在这种情况下,SourceTree并没有知道如何处理它,因此它陷入了试图更新的循环中,但无法读取损坏的数据。因此,需要进行冗长的故障排除。

  10. 隐藏并拉动

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

    繁荣,恐怖结束了。希望。如果没有,这git hub pagethis one可能会为您提供更多帮助,但这对我有用。

答案 5 :(得分:3)

自git lfs 2.5.0起,有一个新命令可用,它使此操作变得更容易(docs):

git lfs migrate import --no-rewrite "broken file.jpg" "another broken file.png" ...

此文件将“迁移”到git lfs,根据.gitattributes,该文件应为lfs,但暂时不存在(这是错误消息的原因)。

--no-rewrite阻止git将其应用于较早的提交,而是创建一个新的提交。

使用-m "commitmessage"设置该提交的提交消息。

答案 6 :(得分:2)

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

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

  1. 该文件包含在 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:插入链接到至少有一个有效的答案)

答案 7 :(得分:1)

如果您只是想摆脱那个错误的提交,可以通过以下方式回到主站点

git reset --soft origin/master
git reset --hard

然后,您就可以摆脱讨厌的7个非LFS文件:-)

答案 8 :(得分:0)

确保已安装git lfs 2.5或更高版本(download here)。

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

>git lfs version
git-lfs/2.7.2

运行:

git lfs migrate import --fixup --everything

拉您的分支并解决任何合并冲突。

在此github comment中找到。

答案 9 :(得分:0)

当明显的错误突然出现时,这就是我们在团队中所做的:

  1. 为该特定类型的文件禁用lfs(修改.gitattributes或通过SourceTree菜单)

  2. 更改将消失,您将看到.gitattributes上的更改

  3. 解决问题:

    3.1一种解决方案是执行git reset --hard。另一种方式,放弃更改。有时文件不会再次出现。

    3.2.1如果先前的解决方案不起作用,请重复1和2。然后确保您位于(A)的该分支已经提交并推送了除那些烦人的文件以外的所有内容。然后提交您的更改,但不要推送。

    3.2.2:转到另一个分支(B)

    3.2.3:删除您对.gitattributes进行提交的本地分支(A),即使它说有未提交的提交也要强制删除。它会忘记提交(以后可以通过GC或其他方法将其删除,但是如果有错误的文件不是很大,则没什么大不了的)

    3.2.4:再次签出分支A。它将下载存储库的先前状态,而无需设置烦人的文件和LFS设置。

始终有效!

答案 10 :(得分:0)

以下过程将添加一个提交,该提交将所有应为lfs指针的二进制文件替换为lfs指针。

  1. 完全清洁工作副本。加上下面的强制添加,可以防止由于.gitignore模式而导致添加或删除任何文件。

    git clean -dfx
    git reset --hard
    git checkout -- .
    
  2. 添加对暂存区中所有内容的删除。工作副本不会被触及。

    git rm --cached -r .
    
  3. 再次从工作副本中读取了所有文件。基本上,这将撤消上一个命令,但将重新评估lfs过滤器。使用-f忽略.gitignore。所有存在的文件先前都已签入,应该再次添加。

    git add -f .
    
  4. 您的暂存区域现在​​仅应包含先前引发“应为指针”错误的二进制文件。

    git commit -m "moved files to lfs"
    

答案 11 :(得分:0)

此错误的一个可能原因是与git LFS相关的.gitattributes更改会影响回购中已添加的文件。

(我不确定要重现的确切步骤,但是当我触摸到一个文件时,该问题似乎发生了,该文件以前受.gitattributes的影响,该文件以前作为非LFS文件提交,现在应该是LFS文件。切换分支似乎加剧了这个问题,或者至少在解决问题之前无法切换分支。)

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


  1. 通过遵循此处的其他答案之一来解决您所在分支的问题(例如,清除缓存并重置。我发现BheeMa's answer是有效的。)
  2. 转到主分支,并确保没有要提交的git status
  3. 强制git重新检查并“重新应用” git属性更改

来自Ratata Tata's answer中的How to make change to .gitattributes take effect

 git rm --cached -r .
 git add -A

警告:请确保在第2步中没有要提交的内容,因为上述步骤将添加以前未版本化的所有文件

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

答案 12 :(得分:0)

以上命令都不适合我,我找到了答案here

git status -s | cut -c 4- | xargs git update-index --assume-unchanged
rm .git/index && git reset

答案 13 :(得分:0)

运行

public class FragmentA extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_a, container, false);
        // get the reference of ListView
        lv_productlist = (ListView) view.findViewById(R.id.lv_productlist);

        showFoodOnListView(db_helper);

        return view;
    }
}

并提交这些更改。即使LFS指针是从文件的哈希派生的,即使其他用户在另一个分支上也是如此,这样做也是安全的。它还可能会捕获某些行尾错误的文件。

答案 14 :(得分:0)

在我的情况下,它是 lfs 规则下的一个文件(我假设它是在没有安装 lfs 或其他东西的情况下签入的)。

所以我在 .gitattributes 文件中找到了它的扩展名,并像这样注释了这一行

#*.7z filter=lfs diff=lfs merge=lfs -text

保存了这个 .gitattributes 然后 git status 显示没有问题。

在那之后,我取消了这一行的注释(删除了 #),保存了 .gitattributes 并且 git status 仍然没有显示任何问题。

答案 15 :(得分:-1)

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

git rm --cached -r .
sleep 1
git reset --hard
sleep 1
git rm .gitattributes
sleep 1
git reset .
sleep 1
git checkout .