忽视git忽略与假设

我已经阅读过几次这些文档,但我仍然没有完全明白这些不同命令之间的差异。 也许这只是我,但文档可能更清晰:

http://git-scm.com/docs/gitignore

https://help.github.com/articles/ignoring-files

此外,很多关于这个问题的评论似乎都使用了“索引”,“承诺”,“跟踪”等词语,这使得这三者之间的差异不太清晰。

我目前(当然有限)的理解:

  • .gitignore匹配的文件将不会被跟踪。 (尽管它们可能以前已被跟踪过。)这意味着它们将不会在未来的git status列表中显示为已更改。 但是,未来的更改仍将与远程回购同步。 换句话说,这些文件仍然是“索引”的,但它们并没有被“追踪”。 由于.gitignore文件位于项目目录中,因此文件本身可以进行版本控制。

  • .git/info/exclude匹配的文件也不会被“追踪”。 另外,这些文件不会被远程同步,因此永远不会被其他用户以任何形式看到。 这些文件应该是特定于单个用户的编辑器或工作流程的文件。 因为它位于.git目录中,所以exclude文件本身不能进行版本控制。

  • assume-unchanged运行的文件也不会在git statusgit diff 。 这似乎与exclude类似,因为这些文件既不是“索引”也不是“跟踪”的。 但是,在assume-unchanged之前要提交的最后一个版本的文件对于回购中的所有用户都将保持可见。

  • 我的问题:

  • 上述解释是否正确? 请纠正我。

  • 如果一个文件已经在一个提交中,那么匹配它在.exclude和running assume-unchanged之间的功能有什么不同? 为什么一个人会喜欢另一种?

  • 我的基本用例是我想避免通过编译文件的差异进行排序,但我仍然希望这些编译后的文件与源文件同步。 gitignore的d文件还会被推送吗? 如果不是,如何管理编译文件的最终部署?

  • 预先感谢您的帮助。


    我将接受来自Junio Hamano(Git维护者)的电子邮件答案,因为我认为它比官方文档更清晰地解释了一些事情,并且可以将其视为“官方”建议:

    .gitignore和.git / info / exclude是调用相同机制的两个UI。 In-tree .gitignore将在项目成员之间共享(即在项目中工作的每个人都应该考虑与那里的忽略模式匹配的路径)。 另一方面,.git / info / exclude是为个人忽略模式而设计的(也就是说,当您在项目中工作时,将它们视为cruft)。

    假设 - 不应该被忽略机制滥用。 这是“我知道我的文件系统操作很慢,我会保证Git不会改变这些路径 - 这样,Git不必每次都检查是否在那里改变了内容我要求'git status'输出“。 除此之外,这并不意味着什么。 特别是,Git没有承诺Git会一直认为这些路径是未经修改的 - 如果Git能够确定标记为假设的路径 - 在未引起额外成本的情况下发生更改,它将保留权利报告该路径已被修改(因此,“git commit -a”可以自由地提交该更改)。


    除了Junio Hamano的回答,Git 2.3.0(2015年2月)现在从gitignore文档中删除

    要忽略已经跟踪的文件中未提交的更改,请使用' git update-index --assume-unchanged '。

    参见Michael J Gruber( mjg )的commit 936d2c9:

    gitignore.txt :不建议assume-unchanged

    git-update-index --assume-unchanged从未打算忽略对跟踪文件的更改( 只是为了 git-update-index --assume-unchanged 一些统计信息 )。
    因此,不要将其作为实现这一目标的手段。


    有希望的是,没有太多的信息来源使用追踪,索引和承诺松散,因为它们都是不同的和有意义的。

  • 索引意味着文件在git索引中。 在过去的某个时间点,有人在文件上使用git add或等效命令。 该文件被跟踪,也可能被提交。
  • 跟踪意味着git正在观察文件的变化。 跟踪任何提交的文件或索引中的任何文件。
  • 承诺意味着该文件在git的历史中。 这个文件至少有一个检查点; 您可以恢复到该文件的任何提交版本。
  • 现在到了我自己知识的极限。 我不确定这个定义,但这是我的理解; 很高兴能够纠正这一点:

    当提交索引文件时,它不再处于索引中。 下一次它被修改(或删除)时,它会回到索引中。 索引是所有跟踪的文件的总和,这些文件与提交的文件不同。

    该索引也称为缓存或暂存区域。

    谈到你的主要问题。 .git / info / exclude与.gitignore相同,只是优先级较低,不在存储库中(因此,未提交和共享)。 既不影响已经跟踪的文件。 两者都会影响当前未被跟踪的文件。 在git addgit commit后更新.gitignore太迟了; git已经跟踪这个文件,并且.gitignore不会影响这个文件。

    假设 - 不变只影响跟踪的文件,因此完全独立于.gitignore。 它可以暂时假装该文件未被跟踪并被忽略(但它不需要,也可以做与正常行为不同的任何操作)。 正如其他答案所提到的,这不用于忽略对文件的更改,只是为了避免在慢速文件系统上执行文件系统操作。

    回复:第3点:你不应该把编译好的文件添加到git中。 将您的文件编译到源代码所在的其他目录,并忽略整个目录。 将编译好的文件捆绑到一个库中,并将其添加到工件库中,但不要将它们放在git中。

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

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

    下一篇: How to revert an unnecessary "git reset HEAD~1"