为什么git的设计区分“忽略”和“未跟踪”文件?

时间:2016-01-30 06:01:46

标签: git

我理解git标准工作流中忽略和未跟踪文件之间的区别,至少操作

我很难理解为什么git的设计师觉得这是一个重要的区别。

IOW,为什么他们不会自动跟踪未被.gitignore.git/info/exclude或全球excludesfile规则排除的每个文件?

请注意:我不是在批评git的设计。我确信这是一个非常好的理由,这个被忽视/未跟踪的区别。从设计的角度来看,我只想了解其背后的基本原理。

编辑:让我这样说吧。假设有一个工具,我们称之为twit,除了没有“未跟踪”的概念外,它与git完全相同:文件可以被忽略或跟踪。有人可以描述一个能够清晰显示git优于twit的情景吗?

EDIT2:我现在意识到,回想起来,我的问题隐含的假设是“好理由”也是“易于理解”的。然而,这种假设并没有成功。有twit的缺点可能只有在使用它一段时间后才能被察觉,这些缺点会导致twit的用户改进到最终看起来像git的东西。 {1}}。

1 个答案:

答案 0 :(得分:6)

因为不忽略文件并不意味着“跟踪所有内容”:

  • 您可以逐步添加和提交,以便不“自动跟踪一千个文件,只是因为它们不被忽略”
  • 你可以发现那些尚未被忽略的文件,但你应该(如果它们已被“自动跟踪”,那将是迟到的:git rm。或者更糟,它已经被提交并推送,你发现它中有敏感信息)

任何“自动”都是一个可疑的想法,因为你的工作树的演变是非常动态的,跟踪它的过程是由反射引导的增量过程,而不是由工具引导的“自动”过程。

  

假设那里有一个工具,我们称它为twit,除了没有“未跟踪”的概念外,在各个方面都与git相同

跟踪,在git中,暗示“自动索引(或暂存)”,如“准备好提交”。
git index背后的所有想法是允许开发人员增量跟踪文件,或者对于文件,逐步跟踪其内容(git add --patch
所有这些都会在“默认情况下跟踪的所有内容”中显示出来。

点击“Why staging directory is also called Index/Git Index?”查看详情。

请注意,之前已经考虑过“re-invent the git interface”,默认情况下会暂停/跟踪所有内容。

但是,正如2010年文章“You could have invented git (and maybe you already have!)”所示,git背后的最初目标是合并补丁。当您向工作树添加多个修补程序时,您不希望盲目地跟踪所有内容,而是要慢慢添加或跟踪需要验证的内容,修补后修补。