'假设之间的区别

我对我不想提交到我的存储库的文件进行本地更改。 它是一个用于在服务器上构建应用程序的配置文件,但我想用不同的设置在本地构建。 当然,当我把'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并不重要。

  • 看到:

  • Junio(当前的git维护者)对于assume-unchanged意图的评论assume-unchanged
  • 在添加skip-worktree补丁后,在git邮件列表中讨论的assume-unchangedskip-worktree之间skip-worktree
  • 他总结道:

    其实这两种标志都不够直观

  • assume-unchanged假定开发人员不应更改文件。 如果一个文件被改变 - 比这个改变并不重要。 此标志旨在提高不变文件夹(如SDK)的性能。
    但如果诺言被破坏并且文件实际上发生了变化,那么git会回复标志以反映现实。 可能在通常不需要更改的文件夹中有一些不一致的标志是可以的。

  • 另一方面,当您指示git不触及特定文件时, skip-worktree非常有用。 这对于已经跟踪的配置文件很有用。
    上游主存储库托管一些生产就绪配置,但您想要更改配置中的某些设置以便能够执行一些本地测试。 并且您不希望意外检查此文件中的更改以影响生产配置。 在这种情况下, skip-worktree可以制作出完美的场景。

  • 链接地址: http://www.djcxy.com/p/36251.html

    上一篇: Difference Between 'assume

    下一篇: git ignore vs. exclude vs. assume