小编典典

Git - “假设不变”和“跳过工作树”之间的区别

all

我对不想提交到存储库的文件进行了本地更改。它是用于在服务器上构建应用程序的配置文件,但我想使用不同的设置在本地构建。自然,当我将“git
status”作为要暂存的内容时,该文件总是会显示出来。我想隐藏这个特定的更改而不是提交它。我不会对文件进行任何其他更改。

澄清一下,使用 .gitignore 不是我想要的,因为这只会阻止添加新文件。我想忽略对存储库中已有文件的更改。

经过一番挖掘,我看到了 2 个选项:assume-unchangedskip-worktree.以前的问题在这里谈到了它们,但并没有真正解释它们的区别。

这两个命令有何不同?为什么有人会使用其中一个?


阅读 303

收藏
2022-03-08

共1个答案

小编典典

你想要skip-worktree

assume-unchanged专为检查一组文件是否已被修改的情况而设计;当您设置该位时,git(当然)假定与索引的该部分对应的文件在工作副本中没有被修改。所以它避免了混乱的stat电话。每当索引中的文件条目发生更改时(因此,当文件在上游更改时),该位都会丢失。

skip-worktree不仅如此:即使git 知道 文件已被修改(或需要由 areset --hard等修改),它也会假装它没有被修改,而是使用索引中的版本。这一直持续到索引被丢弃。

此处对这种差异的影响和典型用例进行了很好的总结:http:
//fallengamer.livejournal.com/93321.html。

从那篇文章:

  • --assume-unchanged假定开发人员不 应该 更改文件。此标志旨在 提高 SDK 等不更改文件夹的性能。
  • --skip-worktree当您指示 git 永远不要触摸特定文件时很有用,因为开发人员 应该 更改它。例如,如果上游主存储库托管一些生产就绪的 配置文件 ,而您不想意外提交对这些文件的更改,这--skip-worktree正是您想要的。
2022-03-08