我已经多次阅读了这方面的文档,但我仍然没有完全理解这些不同命令之间的区别。也许只是我,但文档可以更清晰:
http://git-scm.com/docs/gitignore
https://help.github.com/articles/ignoring-files
而且,很多关于这个主题的评论似乎对“索引”、“提交”、“跟踪”这些词的使用有些松散,这使得这三者之间的区别不那么清晰。
我目前(公认有限)的理解是:
- 以后将不会跟踪在
.gitignore
中匹配的文件。(尽管它们可能先前已经被跟踪。)这意味着它们将永远不会在将来的git status
列表中显示为已更改。* 然而,将来的更改仍将与远程repos同步。但是它们不是“被跟踪的”。因为一个.gitignore
文件在项目目录中,所以文件本身可以被版本化。 - 在
.git/info/exclude
中匹配的文件也不会被“跟踪”。此外,这些文件永远不会被远程同步,因此任何其他用户都不会以任何形式看到。这些文件应该是特定于单个用户的编辑器或工作流的文件。因为它位于.git
目录中,所以exclude
文件本身不能被版本化。 - 运行过
assume-unchanged
的文件也不会出现在git status
或git diff
中,这看起来与exclude
类似,因为这些文件既不被“索引”也不被“跟踪”。但是,在assume-unchanged
之前提交的文件的最后一个版本对repo中的所有用户仍然可见。
我的问题:
1.以上解释正确吗?请指正。
1.如果一个文件已经在提交中,那么在.exclude
中匹配它和在它上面运行assume-unchanged
在功能上有什么不同?为什么人们更喜欢一种方法而不是另一种?
1.我的基本用例是,我希望避免对编译文件的差异进行排序,但我仍然希望这些编译文件沿着源文件同步。gitignore
的文件仍然会被推送吗?如果不会,如何管理编译文件的最终部署?
4条答案
按热度按时间fnatzsnv1#
我将接受this emailed answer from Junio Hamano(Git的维护者),因为我认为它比官方文档更清晰地解释了一些事情,并且它可以被视为“官方”建议:
.gitignore和.git/info/exclude是两个调用相同机制的用户界面。In-tree .gitignore将在项目成员之间共享(即每个项目成员都应将与其中的忽略模式匹配的路径视为cruft)。另一方面,.git/info/exclude用于个人忽略模式(即您在项目中工作时,将其视为cruft)。
Assume-unchanged不应该被滥用于忽略机制,它是,“我知道我的文件系统操作很慢,我的意图是不改变这些路径,所以我让Git用'assume-unchanged'位标记它们。所以,Git不会在每次我请求'git status'输出时检查这些路径的变化”。它没有别的意思,特别是,Git并不承诺总是认为这些路径是未修改的,如果Git可以确定这些路径中的任何一个已经修改,而不增加额外的lstat(2)开销,它保留将其标记为 modified 的权利,因此,“git commit -a”将提交该修改。
klr1opcd2#
Git 2.3.0(2015年2月)添加到Junio Hamano的answer中,现在从
gitignore
documentation中删除了若要忽略已跟踪文件中未提交的更改,请使用“
git update-index --assume-unchanged
”。参见Michael J Gruber (
mjg
)中的commit 936d2c9:gitignore.txt
:不建议使用assume-unchanged
git-update-index --assume-unchanged
从未打算忽略对被跟踪文件的更改(只是为了节省一些统计信息)。所以不要把它作为实现这一目标的手段。
7tofc5zh3#
希望没有太多的信息源松散地使用tracked、indexed和committed,因为它们都是不同的和有意义的。
git add
或等效命令。该文件被跟踪,也可能被提交。就我所知,我对这个定义不太清楚,但这是我的理解;很高兴能得到纠正:
当一个索引文件被提交时,它就不再在索引中。下次它被修改(或删除)时,它就回到索引中。* 索引是所有与提交的文件不同的被跟踪文件的总和 *。
索引也称为该高速缓存或临时区域。
回到你的主要问题。.git/info/exclude和.gitignore是一样的,只是优先级较低,不在仓库中(所以,没有提交和共享)。两者都不影响已经被跟踪的文件。两者都影响当前没有被跟踪的文件。在
git add
或git commit
之后更新.gitignore太晚了; git已经跟踪了这个文件,.gitignore不会影响它。Assume-unchanged只影响被跟踪的文件,因此与. gitignore完全不同。它可以暂时假装文件未被跟踪并被忽略(但它不必这样做,也可以做任何与正常行为不同的事情)。正如其他答案所提到的,这不是用于忽略文件的更改,只是为了潜在地避免在缓慢的文件系统上进行文件系统操作。
回复:第3点:你不应该把编译好的文件添加到git中。把你的文件编译到一个与源代码所在的目录不同的目录中,忽略整个目录。把你的编译好的文件捆绑到一个库中,并把它添加到一个工件仓库中,但不要把它们放在git中。
68bkxrlz4#
我认为.gitignore和assume-unchanged的区别在于
1..gitignore可以与团队中的其他人共享,但假设必须为每个成员单独配置unchanged。