代码之家  ›  专栏  ›  技术社区  ›  mark

无法撤消Git中的文件

  •  0
  • mark  · 技术社区  · 5 年前

    我有一个奇怪的情况,在提交之后,一个文件在Git中被修改了,我就是无法撤销它。

    请注意:

    C:\xyz\tip [master ≡ +0 ~1 -0 !]> git st
    ## master...origin/master
     M Dependencies/BSI/Debug/64/TFC80NET.dll
    C:\xyz\tip [master ≡ +0 ~1 -0 !]> git reset --hard HEAD
    Encountered 1 file(s) that should have been pointers, but weren't:
            Dependencies/BSI/Debug/64/TFC80NET.dll
    HEAD is now at 9ffa900f53 Merged PR 7525: Adding relationship conditions only do not enable Save button
    C:\xyz\tip [master ≡ +0 ~1 -0 !]> git co HEAD -- Dependencies/BSI/Debug/64/TFC80NET.dll
    Encountered 1 file(s) that should have been pointers, but weren't:
            Dependencies/BSI/Debug/64/TFC80NET.dll
    C:\xyz\tip [master ≡ +0 ~1 -0 !]>
    

    发生了什么事?如何排除故障?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Mark Adelsberger    5 年前

    您显示的输出表明LFS已配置,如您所说,它 应该 正在跟踪有问题的文件。

    在LFS控制下。LFS知道这是 想象上的 管理该路径上的文件,但它会看到repo中在该路径上实际引用的原始文件(而不是指针),因此 Encountered 1 file(s) that should've been pointers, but weren't .

    git命令本身很可能已经执行了预期的任务[1],但您也会收到这些警告,告诉您LFS现在无法完成其工作。

    你可以很容易地解决这个问题。

    git rm --cached Dependencies/BSI/Debug/64/TFC80NET.dll
    git add Dependencies/BSI/Debug/64/TFC80NET.dll
    

    这将导致文件被重新暂存,并且,当文件被重新暂存时,LFS“clean”过滤器将其洗牌到LFS repo中,并用指针文件替换索引中的文件。

    您可以提交该更改,然后来自该提交转发的操作将不会得到上述警告,并且不会将大文件的新版本直接提交到核心repo中。(这可能真的很重要,也可能不重要,这取决于这个.dll是否曾经改变过。这是您可能从LFS获得的最小值。)

    不会

    filter-branch 剧本每一个都有自己的问题和陷阱,所以你应该仔细阅读其中的内容。

    所有这些技术的共同点是,它们都是彻底的历史重写,这将使repo的所有现有克隆(以及可能依赖于特定提交ID值的任何工具或文档)无效。因此,在进行这种重写之前,有必要与所有使用回购协议的人进行协调。(一种合理的做法是让每个人都将所有更改推送到源站(即使未处于完全合并状态);然后让每个人放弃其本地克隆;然后进行重写;然后让每个人从新清理的repo重新克隆。)


    [1] 如果您深入挖掘,发现reset和checkout命令没有还原索引树和工作树中的文件,那么可能还有其他问题需要解决。

        2
  •  0
  •   Olivier de Rivoyre    5 年前

    对于谷歌用户,由 BheeMa here 这个解决方案对我有效:

    git lfs uninstall
    git reset --hard
    git lfs install
    git lfs pull