多个`.gitignore'皱起了眉头?

除非一个回购包含了几个独立的项目,否则在整个回购的根目录下只有一个.gitignore文件是最简单的。 有没有一个标准的最佳做法,或在线分析,当一种方法比另一种更好?

我可以想到至less有两种情况,你想在不同的(子)目录中有多个.gitignore文件。

  • 不同的目录有不同types的文件要忽略。 例如,项目顶部目录中的.gitignore忽略生成的程序,而Documentation/.gitignore忽略生成的文档。

  • 忽略给定的文件只在给定的(子)目录(你可以在/sub/foo .gitignore使用/sub/foo )。

请记住, .gitignore文件中的模式recursion地应用于文件所在的(子)目录及其所有子目录,除非模式包含“/”(例如,模式name适用于给定目录及其所有子目录中名为name任何文件,而/name适合只在给定的目录中使用这个名称)。

作为一个切合点,一个能够拥有多个.gitignore文件的例子非常有用,那就是如果你想在你的工作副本中添加一个额外的目录,而这个目录是你永远不想提交的。 只要在该目录中放置一个1字节的.gitignore (只包含一个星号),它就不会在git status显示出来。

你可以有多个.gitignore ,每个当然都在它自己的目录中。
要检查哪个gitignore规则负责忽略文件,请使用git check-ignoregit check-ignore -v -- afile

每个分支可以有一个不同版本的.gitignore文件:我已经看到了这种configuration,以确保一个分支忽略一个文件,而另一个分支不会: 例如看到这个问题 。

如果您的回购包含多个独立项目,最好将其作为子模块引用。
这将是实际的最佳实践,允许每个项目独立克隆(与其各自的.gitignore文件),同时被全球父项目中的特定修订引用。
更多地了解子模块的真实性质 。


请注意,自从git 1.8.2(2013年3月)以来,您可以执行git check-ignore -v -- yourfile来查看哪个gitignore运行(从哪个.gitignore文件)应用于“ yourfile ”,并更好地理解为什么所述文件被忽略。
请参阅“ 哪个gitignore规则忽略了我的文件?

临单

  • 容易find。

  • 如果我有多个gitignore,在回购的几个级别,狩猎排除规则可能是相当困难的。

  • 对于多个文件,通常也会有一些重复。

赞成多个

  • 范围“知识”到需要文件树的部分。

  • 由于Git只跟踪文件,空的.gitignore是提交“空”目录的唯一方法。

    (在Git 1.8之前,排除像my/**.example这样的模式的唯一方法就是使用模式my/**.example my/.gitignore创buildmy/.gitignore ,这个理由现在不适用,因为你可以/my/**/*.example 。)


我更喜欢一个文件,我可以find所有的排除。 我从来没有错过每个目录.svn,我也不会错过每个目录.gitignore。

也就是说,多个gitignores是相当普遍的。 如果你确实使用它们,至less应该保持一致,以使其合理使用。 例如,您可以将它们放在根目录中的一个级别的目录中。

有很多情况下,你想提交一个目录到你的Git仓库,但没有它的文件,例如logscacheuploads目录等。

所以我总是做的是在这些包含以下内容的目录中添加一个.gitignore文件:

 * !.gitignore 

有了这个.gitignore文件,Git将不会跟踪这些目录中的任何文件,但仍然允许我将.gitignore文件以及目录本身添加到回购。