git忽略与排除与假定不变

mcvgt66p  于 2022-12-21  发布在  Git
关注(0)|答案(4)|浏览(240)

我已经多次阅读了这方面的文档,但我仍然没有完全理解这些不同命令之间的区别。也许只是我,但文档可以更清晰:
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 statusgit diff中,这看起来与exclude类似,因为这些文件既不被“索引”也不被“跟踪”。但是,在assume-unchanged之前提交的文件的最后一个版本对repo中的所有用户仍然可见。

我的问题:
1.以上解释正确吗?请指正。
1.如果一个文件已经在提交中,那么在.exclude中匹配它和在它上面运行assume-unchanged在功能上有什么不同?为什么人们更喜欢一种方法而不是另一种?
1.我的基本用例是,我希望避免对编译文件的差异进行排序,但我仍然希望这些编译文件沿着源文件同步。gitignore的文件仍然会被推送吗?如果不会,如何管理编译文件的最终部署?

fnatzsnv

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”将提交该修改。

klr1opcd

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从未打算忽略对被跟踪文件的更改(只是为了节省一些统计信息)。
所以不要把它作为实现这一目标的手段。

7tofc5zh

7tofc5zh3#

希望没有太多的信息源松散地使用tracked、indexed和committed,因为它们都是不同的和有意义的。

  • Indexed表示该文件在git索引中。在过去的某个时候,有人对该文件使用了git add或等效命令。该文件被跟踪,也可能被提交。
  • Tracked意味着git正在监视文件的变化,任何提交的文件或索引中的文件都会被跟踪。
  • 提交意味着该文件在git的历史记录中,该文件至少有一个检查点;你可以恢复到文件的任何提交版本。

就我所知,我对这个定义不太清楚,但这是我的理解;很高兴能得到纠正:
当一个索引文件被提交时,它就不再在索引中。下次它被修改(或删除)时,它就回到索引中。* 索引是所有与提交的文件不同的被跟踪文件的总和 *。
索引也称为该高速缓存或临时区域。
回到你的主要问题。.git/info/exclude和.gitignore是一样的,只是优先级较低,不在仓库中(所以,没有提交和共享)。两者都不影响已经被跟踪的文件。两者都影响当前没有被跟踪的文件。在git addgit commit之后更新.gitignore太晚了; git已经跟踪了这个文件,.gitignore不会影响它。
Assume-unchanged只影响被跟踪的文件,因此与. gitignore完全不同。它可以暂时假装文件未被跟踪并被忽略(但它不必这样做,也可以做任何与正常行为不同的事情)。正如其他答案所提到的,这不是用于忽略文件的更改,只是为了潜在地避免在缓慢的文件系统上进行文件系统操作。
回复:第3点:你不应该把编译好的文件添加到git中。把你的文件编译到一个与源代码所在的目录不同的目录中,忽略整个目录。把你的编译好的文件捆绑到一个库中,并把它添加到一个工件仓库中,但不要把它们放在git中。

68bkxrlz

68bkxrlz4#

我认为.gitignore和assume-unchanged的区别在于
1..gitignore可以与团队中的其他人共享,但假设必须为每个成员单独配置unchanged。

  1. assume-unchanged是被跟踪的文件。如果一个文件有配置信息,但可以被团队修改,这是非常有用的。如果一个文件被设置为assume-unchanged,但被其他人修改了,并被推送到远程仓库,git会在尝试从远程仓库拉取时提醒。

相关问题