git ignore vs. exclude vs. assume-unchanged

Ben*_*Ben 61 git gitignore

我已经多次阅读过这方面的文档了,我仍然没有完全理解这些不同命令之间的差异.也许这只是我,但文档可能更清晰:

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 status或中git diff.这看起来很相似exclude,因为这些文件既没有"索引"也没有"跟踪".但是,之前要提交的文件的最后一个版本assume-unchanged对于repo中的所有用户仍然可见.

我的问题:

  1. 以上解释是否正确?请指正.

  2. 如果文件已经在提交中,那么在匹配.exclude和运行文件 之间的功能有何不同assume-unchanged?为什么一个人更喜欢另一种方法?

  3. 我的基本用例是我想避免在编译文件中对差异进行排序,但我仍然希望这些编译文件与源文件一起同步.将一个gitignore"d文件仍然推?如果没有,如何管理编译文件的最终部署?

在此先感谢您的帮助.

Ben*_*Ben 81

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

.gitignore和.git/info/exclude是调用相同机制的两个UI.树内.gitignore将在项目成员之间共享(即,在项目中工作的每个人都应该考虑与那里的忽略模式相匹配的路径).另一方面,.git/info/exclude用于个人忽略模式(即,您在项目工作时,将其视为残酷).

对于忽略机制,不应该滥用假设 - 未更改.它是"我知道我的文件系统操作很慢.我会保证Git我不会通过使用那一点来改变这些路径 - 这样,Git不必检查我是否每次都改变它们的内容我要求'git status'输出".除此之外,它并不意味着什么.特别是,Git 并不承诺Git会一直认为这些路径是未经修改的 - 如果Git可以确定标记为假设的路径 - 未更改而没有产生额外的lstat(2)成本,则保留权利报告路径 已被修改(因此,"git commit -a"可以自由提交该更改).

  • "通过那种方式制造它们 - 那样"?那是什么意思? (5认同)
  • @BlueClouds,在"那种方式"之后有一个逗号,因为它是一个新想法的开始.我*怀疑*"用那个位制作它们"意图说"标记"并且指的是由"假设未改变"作为"位"创建的标志 - 我想这个标记只需要一点存储,因为它是二进制州.我承认这部分是猜测,但我没有理解答案,所以它可能对你有帮助. (3认同)
  • 人们,作品“标记”中有一个错字,它变成了“制作”。它的全部意思是每个文件都有一个git保留的标志,并且可以使用该管道命令设置和重置该标志。 (2认同)

Von*_*onC 11

添加Junio Hamano的答案,Git 2.3.0(2015年2月)现在已从文档中删除gitignore

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

提交936d2c9迈克尔·格鲁伯Ĵ( )mjg:

gitignore.txt:不建议 assume-unchanged

git-update-index --assume-unchanged从来没有打算忽略对跟踪文件的更改(只是为了节省一些统计数据).
因此,不要将其作为实现这一目标的手段.


Pau*_*cks 5

希望没有太多的信息源被松散地使用,索引和提交,因为它们都是不同且有意义的。

  • 已建立索引意味着该文件位于git索引中。在过去的某个时候,有人git add在文件上使用过或具有等效命令。该文件已被跟踪,也可能已提交。
  • 已跟踪表示git正在监视文件中的更改。跟踪任何已提交的文件或索引中的任何文件。
  • 提交意味着该文件在git的历史记录中。该文件至少有一个检查点。您可以还原到该文件的任何提交版本。

现在就我所知。我不确定这个定义,但这是我的理解;很高兴对此进行纠正:

提交索引文件后,该文件将不再在索引中。下次修改(或删除)时,它又回到索引中。 索引是与提交的所有跟踪文件的总和

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

关于您的主要问题。.git / info / exclude与.gitignore相同,只是优先级较低,不在存储库中(因此,未提交和共享)。都不会影响已经跟踪的文件。两者都会影响当前未跟踪的文件。在.gitignore之后git addgit commit为时已晚;git已经跟踪了文件,.gitignore不会对此产生影响。

假定未更改仅影响跟踪的文件,因此与.gitignore完全分开。它可以暂时假装该文件未跟踪并被忽略(但它不一定必须也不能与正常行为有所不同)。就像其他答案提到的那样,这并不是用来忽略对文件的更改,只是为了潜在地避免在慢速文件系统上进行文件系统操作。

回复:第3点:您不应将编译文件添加到git中。将文件编译到源所在的其他目录,然后忽略整个目录。将编译后的文件捆绑到一个库中,并将其添加到工件存储库中,但不要将其放入git中。