无法撤消Git中的文件

时间:2019-01-10 19:37:52

标签: windows git

我有一个奇怪的情况,在某些提交之后,文件在Git中保留修改,而我无法撤消它。

我们正在使用LFS,该文件是二进制文件。 LFS已安装在我的计算机上,并已为存储库配置。

请注意:

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 !]>

这是怎么回事?如何解决它?

2 个答案:

答案 0 :(得分:1)

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

但是,似乎已在文件已添加到存储库中之后设置了此配置,因此,此特定文件不在中,处于LFS的控制之下。 LFS知道在该路径下管理文件是应该,但是它可以看到该路径中回购中实际引用的原始文件(而不是指针),因此是Encountered 1 file(s) that should've been pointers, but weren't。 / p>

git命令本身很可能已经完成了预期的任务[1],但是您还会收到这些警告,以告诉您LFS无法按照目前的状态进行工作。

您可以很轻松地解决此问题。

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

这将导致文件重新登台,并且在重新分段时,LFS“干净”过滤器会将其改组为LFS存储库,并用指针文件替换在索引中。

您可以提交该更改,然后从该向前提交的操作将不会收到上述警告,并且不会将新版本的大文件直接提交到核心存储库中。 (这可能会或可能不会很重要,具体取决于此.dll是否发生了更改。这是您可能会从LFS中获得的最小最小值。)

但是不会会做什么:它不会从核心存储库中删除任何现有的.dll版本。这意味着已经存在的膨胀将仍然存在。克隆存储库的人们仍然会为下载那些历史参考版本的成本感到负担。

如果您想充分利用LFS,那将是进行历史记录重写的目的,可以使用“ lfs migration”工具,BFG Repo Cleaner的lfs模式或自定义{{1} }脚本。这些中的每一个都有其自身的问题和陷阱,因此您需要阅读其中涉及的内容。

所有这些技术的共同之处在于,它们是清除历史记录的重写,这将使存储库的所有现有克隆(以及可能依赖于特定提交ID值的任何工具或文档)都无效。因此,在进行此类重写之前,有必要与使用回购协议的所有人进行协调。 (一种合理的做法是,让所有人将所有更改都推向原点-即使不是处于完全合并的状态;然后让所有人放弃其本地克隆;然后进行重写;然后让所有人从新的数据库中重新克隆-已清理的仓库。)


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

答案 1 :(得分:0)

对于BheeMa here提供的Google员工,此解决方案对我有效:

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