git update-index --assume-unchanged and git reset

43
这里是情境描述:
在我的工作目录中,我有一些文件(我们称它们为A、B、C),我对它们进行了编辑。然后我运行了git update-index --assume-unchanged命令。现在,git status返回为空。很好。
现在,如果我执行git reset --hard,文件A、B和C的内容将恢复到编辑之前并且“假定未更改”的内容。有没有办法阻止git实际还原文件A、B和C,并简单地忽略它们?
谢谢,
Ken

嗯,好问题。我不知道答案,但也许你可以编写一个小脚本,在这三个文件上执行检出操作,然后将其用作后置动作钩子,例如重置,这样它们就会被覆盖。 - Tyler
3个回答

50

你可以这样做:

git update-index --skip-worktree A

不错!那个有效。我现在唯一的问题是eclipse的git插件(egit)无法处理--skip-worktree... 烦人。 - Ken Hirakawa
请注意,如果您启用了稀疏检出,则此设置将被覆盖,您应该使用sparse-checkout文件来忽略相关文件。 - AndreKR
使用 sparse-checkout 文件不仅会忽略这些文件,还会自动删除它们,这样做是否合适? - Powerman

1

如果您想忽略这些文件,您需要添加一个.gitignore文件条目。只需添加.gitignore文件,提交它,您现在将忽略对它们的任何更改。

然而,我认为您需要告诉我们为什么要这样做,文件的内容是什么,它们的性质是什么(它们是工件吗?)- 然后您将得到适当的答案。

此外,使用assume-unchangedupdate-index旨在用于增加性能,如果您的操作系统文件系统上的树花费了很长时间来收集特定路径的更改。除非您由于漫长的git statusgit diff或其他命令执行时间而忽略这些文件,否则我不建议在您的情况下使用它。


2
文件A、B和C实际上是Unix符号链接文件,它们被检出到Windows系统中。由于Windows无法处理Unix符号链接,Git将它们转换为纯文本文件。然后我的脚本运行并查找这些“虚拟”文件,并用Windows符号链接替换它们。如果我在这里执行git status,则会发现A、B和C处于修改状态。但是,我希望永远忽略对A、B和C的更改。git update-index --assume-unchanged非常好用,除非执行git reset。因此,这就是问题所在。希望这能澄清事情 =) - Ken Hirakawa
@KenHirakawa 你需要使用 smudgeclean。请参考这里的教程:https://www.bignerdranch.com/blog/git-smudge-and-clean-filters-making-changes-so-you-dont-have-to/。如果您更新问题以反映您要做什么,我可以留下答案。 - DylanYoung

1
你可以使用

标签


$ git stash
$ git reset --hard
$ git stash pop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接