'假设之间的区别
我对我不想提交到我的存储库的文件进行本地更改。 它是一个用于在服务器上构建应用程序的配置文件,但我想用不同的设置在本地构建。 当然,当我把'git status'作为上演时,这个文件总是显示出来。 我想隐藏这个特定的变化,而不是提交它。 我不会对文件做任何其他更改。
经过一番挖掘,我看到了两个选项:“假设 - 不变”和“跳过工作树”。 以前的问题在这里讨论,但并没有真正解释它们的区别。 我的问题是这两个命令如何不同? 为什么有人会使用一个或另一个?
你想skip-worktree
。
assume-unchanged
是针对检查一组文件是否已被修改是昂贵的情况而设计的; 当你设置这个位时, git
(当然)会假定在该工作副本中没有修改与该索引部分对应的文件。 所以它避免了stat
调用的混乱。 只要文件在索引中的条目发生更改(因此,文件在上游发生更改时),该位就会丢失。
skip-worktree
:即使git
知道文件已被修改(或需要通过reset --hard
进行修改reset --hard
等),它会假装它没有被使用,而是使用索引中的版本。 这一直持续到索引被丢弃。
有一个很好的总结这种差异的影响和这里的典型用例:http://fallengamer.livejournal.com/93321.html。
从那篇文章:
--assume-unchanged
假定开发人员不应更改文件。 此标志旨在提高不变文件夹(如SDK)的性能。 --skip-worktree
在你指示git不触及特定文件时非常有用,因为开发者应该改变它。 例如,如果主存储库上游托管了一些生产就绪配置文件,并且您不希望意外提交这些文件的更改, --skip-worktree
正是您想要的。 注意:fallengamer在2011年做了一些测试(所以它们可能已经过时),这里是他的发现:
操作
git pull
: 无论如何,Git都会保留本地更改。
因此,您不会意外丢失任何标有任何标志的数据。
assume-unchanged
标志的文件:Git不会覆盖本地文件。 相反,它会输出冲突和建议如何解决它们 skip-worktree
标志的文件:Git不会覆盖本地文件。 相反,它会输出冲突和建议如何解决它们 。
git stash
git pull
使用
skip-worktree
产生一些额外的手动工作,但至少如果您有任何本地更改,则不会丢失任何数据。 assume-unchanged
标志的文件:放弃所有本地更改,但无法恢复它们。 效果就像' git reset --hard
'。 ' git pull
'电话会成功 skip-worktree
标志的文件:Stash不适用于skip-worktree
文件。 ' git pull
'会失败,并出现与上面相同的错误。 开发人员被迫手动重置skip-worktree
标志,以便能够存储并完成失败的pull
。 。
git pull
这两个标志不会阻止您获取上游更改。 Git检测到你违背了承诺
assume-unchanged
承诺,并通过重置标志来选择反映现实。 assume-unchanged
标志的文件:内容被更新,标志丢失。 '
git ls-files -v
'会显示该标志被修改为H
(来自h
)。 skip-worktree
标志的文件:内容已更新,标志被保留。 '
git ls-files -v
'将显示与pull
之前相同的S
标志。 。
git reset --hard
Git不会触及
skip-worktree
文件,并反映assume-unchanged
文件的实际情况(承诺实际更改的文件已更改)。 assume-unchanged
标志的文件:文件内容已恢复。 标志重置为H
(从h
)。 skip-worktree
标志的文件:文件内容完好无损。 国旗保持不变。 他补充了以下分析:
它看起来像skip-worktree
正在努力保存您的本地数据 。 但是,如果它是安全的,它并不妨碍你获得上游的变化。 加上git不会重置pull
标志。
但是忽略“ reset --hard
”命令对于开发者来说可能会是一个令人讨厌的惊喜 。
在pull
操作中, Assume-unchanged
标志可能会丢失,并且这些文件中的局部变化似乎对git并不重要。
看到:
assume-unchanged
意图的评论assume-unchanged
, skip-worktree
补丁后,在git邮件列表中讨论的assume-unchanged
和skip-worktree
之间skip-worktree
。 他总结道:
其实这两种标志都不够直观 。
assume-unchanged
假定开发人员不应更改文件。 如果一个文件被改变 - 比这个改变并不重要。 此标志旨在提高不变文件夹(如SDK)的性能。
但如果诺言被破坏并且文件实际上发生了变化,那么git会回复标志以反映现实。 可能在通常不需要更改的文件夹中有一些不一致的标志是可以的。
另一方面,当您指示git不触及特定文件时, skip-worktree
非常有用。 这对于已经跟踪的配置文件很有用。
上游主存储库托管一些生产就绪配置,但您想要更改配置中的某些设置以便能够执行一些本地测试。 并且您不希望意外检查此文件中的更改以影响生产配置。 在这种情况下, skip-worktree
可以制作出完美的场景。