除非一个repo由几个独立的项目组成,否则在repo的根文件中只有一个.gitignore文件似乎比在整个repo中有多个.gitignore文件要简单得多。在这方面是否有一个标准的最佳实践,或者分析什么时候一种方法比另一种更好?
.gitignore
git check-ignore
git check-ignore -v -- afile
并且你可以在每个分支拥有不同版本的.gitignore文件:我已经见过这种配置,以确保一个分支忽略一个文件,而另一个分支不会:参见这个举个例子。
git check-ignore -v -- yourfile
yourfile
gitignore
我可以想到至少两种情况,你想要在不同的(子)目录中有多个.gitignore文件。
不同的目录有不同类型的文件需要忽略。例如,项目顶部目录中的.gitignore会忽略生成的程序,而Documentation/.gitignore会忽略生成的文档。
Documentation/.gitignore
仅忽略给定(子)目录下的给定文件(不过,可以在.gitignore中使用/sub/foo)。
/sub/foo
请记住,.gitignore文件中的模式递归应用于文件所在的(子)目录及其所有子目录,除非pattern包含'/'(例如,模式name适用于给定目录中名为name的任何文件及其所有子目录,而/name只适用于给定目录中同名的文件)。
name
/name
作为一个切题的注意,在一种情况下,拥有多个.gitignore文件的能力是非常有用的,如果你想在你的工作副本中有一个额外的目录,而你从来没有打算提交。只要在该目录中放入一个1字节的.gitignore(只包含一个星号),它就永远不会出现在git status等目录中。
git status
箴单
很容易找到。
如果我在回购的几个级别上有多个gitignore,那么查找排除规则可能相当困难。
如果有多个文件,通常还会出现相当多的重复。
支持多个
将“知识”限定在文件树中需要它的部分。
(在Git 1.8之前,排除像my/**.example这样的模式的唯一方法是用模式**.foo创建my/.gitignore。这个原因现在不适用,因为你可以做/my/**/*.example.)
my/**.example
**.foo
my/.gitignore
/my/**/*.example
我更喜欢一个单独的文件,在那里我可以找到所有的排除。我从来没有错过每个目录。svn,我也不会错过每个目录。gitignore。
也就是说,多次gitignores是很常见的。如果你确实使用它们,至少在使用时保持一致,使它们能够合理地使用。例如,您可以将它们放在距离根目录只有一层的目录中。
在很多情况下,你想要提交一个目录到你的Git repo,但其中没有文件,例如logs, cache, uploads目录等。
logs
cache
uploads
所以我总是在这些目录中添加一个.gitignore文件,内容如下:
# this directory is intentionally ignored /* !/.gitignore
使用这个.gitignore文件,Git将不会跟踪这些目录中的任何文件,但仍然允许我将.gitignore文件以及目录本身添加到repo。
在子文件夹中.gitignore的另一个用例是在monorepos中,每个repo可能更适合指定应该忽略哪些文件,而不是将它们全部移动到单个超大.gitignore中,从而向下延伸到每个项目。
示例:我们有一个基于nx构建系统的monorepo。在它里面,我们有一个tools文件夹,其中包含各种实用程序,其中一些是独立的小项目。在这种情况下,每个工具(例如,它们有自己的package.json)也有一个单独的.gitignore似乎是合适的。它更容易维护,也更容易让开发人员看到发生了什么。
nx
tools
package.json