当前位置: 首页 > 知识库问答 >
问题:

git忽略vs.排除vs.假设不变

席乐童
2023-03-14

我已经读了几遍这方面的文档,我仍然不能完全理解这些不同命令之间的区别。也许这只是我,但是文档可以更清晰:

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

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

此外,许多关于这一主题的评论似乎使用了“索引”、“promise”和“跟踪”这几个词,这使得这三个词之间的区别不那么明显。

我目前(不可否认的是有限的)理解:

>

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

    . git/info/的排除中匹配的文件也不会被跟踪。此外,这些文件永远不会被远程同步,因此任何其他用户都不会看到任何形式的文件。这些文件应该是特定于单个用户的编辑器或工作流的文件。因为它在. git目录中,的排除文件本身不能被版本化。

    在其上运行假定不变的文件也不会显示在 git 状态git diff 中。这似乎类似于排除,因为这些文件既没有“索引”也没有“跟踪”。但是,在假定不变之前要提交的文件的最后一个版本将对存储库中的所有用户保持可见。

    > < li>

    以上解释是否正确?请指正。

    如果一个文件已经在提交中,那么在中匹配它。排除和在上面运行不改变的之间的功能区别是什么?为什么人们更喜欢一种方法而不是另一种方法?

    我的基本用例是,我想避免对编译文件的差异进行排序,但我仍然希望这些编译文件与源文件同步。gitignored文件仍然会被推送吗?如果没有,如何管理已编译文件的最终部署?

    提前感谢任何帮助。

  • 共有3个答案

    端木兴国
    2023-03-14

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

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

    现在就我自己的知识而言。我不确定这个定义,但这是我的理解;很高兴被纠正:

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

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

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

    假设未更改仅影响跟踪的文件,因此与.gitignore完全分离。它可以暂时假装文件未被跟踪和忽略(但它不必这样做,也可以做与正常行为不同的事情)。正如其他答案所提到的,这并不是用来忽略对文件的更改,而是用来潜在地避免在慢速文件系统上执行文件系统操作。

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

    傅毅然
    2023-03-14

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

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

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

    git更新索引——假设未更改从未打算忽略对跟踪文件的更改(只是为了节省一些统计数据
    因此,不要将其作为实现这一目标的手段。

    戚永福
    2023-03-14

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

    .gitignore 和 .git/info/exclude 是调用相同机制的两个 UI。树内 .gitignore 将在项目成员之间共享(即,参与项目的每个人都应该将匹配其中的忽略模式的路径视为垃圾)。另一方面,.git/info/exclude 是针对个人忽略模式的(即你在处理项目时,将它们视为笨蛋)。

    假设不变不应被滥用为忽略机制。它是,“我知道我的文件系统操作很慢。我的意图是不改变这些路径,所以我让Git用‘假设不变’位标记它们。所以,每次我请求‘gitstatus’输出时,Git都不会检查这些路径中的更改”。除此之外,它没有其他含义。特别是,Git并不promise总是考虑这些路径是未修改的。如果Git可以确定这些路径中的任何一条发生了更改,而不会产生额外的lstat(2)成本,则它保留将其标记为已修改的权利。因此,“gitcommit-a”将提交该更改。

     类似资料:
    • 我有一个文件,我已在签出时标记为假设不变。大多数命令(例如,、

    • 嗨! 我需要扫描mysql(5.1)上的一个非常大的表, 该表大致如下: 我需要将main_id+键的所有唯一值获取到一个新表中。 使用以下查询需要花费大量时间(在非常快的服务器上3天后仍在运行): 所以我的问题是- 这会更快吗?

    • 突出显示符号,单击鼠标右键-- 按照这个答案,我成功地删除了文件,方法是在我的用户设置中添加到文件:排除。但是在那里添加(和类似的全局),也没有到文件:观察者排除做任何事情。还在我的远程ssh设置和工作区设置中尝试了此设置。 有人知道如何过滤这些引用吗?仅供参考,我在 Windows 1.62.2 上运行 VS 代码 10,我配置的远程 SSH python 可执行文件是 conda 环境中的 P

    • 我正在尝试将一个项目从gwt-2.6.1迁移到gwt-2.7。但是,我遇到了一个问题。在一个继承的模块中,由于某种原因,gwt编译器忽略了gwt.xml。所以我有这样的东西。gwt.xml: 但是在使用带有gwt-maven-plugin的maven编译时,我一直收到这样的错误: 如您所见,gwt尝试在servlet目录中编译一个文件,该文件在中被排除。gwt。xml。原因可能是什么?gwt-2.

    • 问题内容: 我正在使用此代码来计算忽略周末的两个日期之间的差异: 我还有一个名为table1的表,其中存在“日期”列(其类型为“ DATE”),其中记录了假期的所有日期。 示例表1: 我正在尝试使我的代码检查该表,并且如果一个日期在上面的两个日期之间,则它在输出中为-1天。 问题答案: 如果将其划分为以下任务,则应该很容易: 生成所有使用两个给定日期之间的日期 行生成 方法如图所示。 忽略周末的日