【问题标题】:git update-index --assume-unchanged and git resetgit update-index --assume-unchanged 和 git reset
【发布时间】:2011-08-31 12:52:55
【问题描述】:

这是场景:

在我的工作目录中,我有许多已编辑的文件(我们称它们为 A、B、C)。然后我在这些文件上运行git update-index --assume-unchanged。现在git status 返回空白。很好。

现在,如果我执行git reset --hard,文件 A、B 和 C 的内容将恢复到我编辑它们之前的内容并“假定-未更改”它们。

有没有办法阻止 git 实际还原文件 A、B 和 C,而直接忽略它们?

谢谢,

【问题讨论】:

  • 嗯,好问题。我不知道答案,但也许你可以编写一个小脚本来检查这三个文件,然后将其用作重置等操作的后操作挂钩,这会导致它们被覆盖。

标签: git reset


【解决方案1】:

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

但是,我认为您需要告诉我们您为什么这样做,文件的内容是什么,它们的性质(它们是人工制品吗?)-然后您就会得到正确的答案。

此外,update-indexassume-unchanged 旨在用于提高性能,如果您的操作系统文件系统上的树需要很长时间来收集特定路径的更改。我不建议在您的情况下使用它,除非您由于冗长的 git statusgit diff 或其他命令执行时间而忽略了这些文件。

【讨论】:

  • 文件 A、B 和 C 实际上是被检出到 Windows 系统中的 unix 符号链接文件。由于 windows 不能使用 unix 符号链接,git 将它们转换为纯文本文件。然后我的脚本运行并找到这些“虚拟”文件并用 Windows 符号链接替换它们。如果我在这里执行 git status,那么我的 A、B 和 C 处于修改状态。然而,相反,我希望对 A、B、C 的更改几乎永远被忽略。 git update-index --assume-unchanged 效果很好,除非发出 git reset 。因此问题。希望这能澄清一点=)
  • @KenHirakawa 你想要smudgeclean。请参阅此处的教程:bignerdranch.com/blog/…。如果您更新您的问题以反映您想要做什么,我可以留下答案。
【解决方案2】:

你可以这样做:

git update-index --skip-worktree A

【讨论】:

  • 不错!这样可行。我现在唯一的问题是eclipse(egit)的git插件无法处理--skip-worktree ... Grr。
  • 请注意,如果您启用了sparse checkouts,此设置将被覆盖,您应该使用sparse-checkout 文件忽略相关文件。
  • 不使用sparse-checkout 文件会导致不仅忽略而且自动删除这些文件吗?
【解决方案3】:

你可以使用

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

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 2013-04-27
    • 2012-08-30
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    相关资源
    最近更新 更多