多个`.gitignore`会皱眉吗?


239

除非存储库由几个独立的项目组成,否则似乎.gitignore在存储库的根目录中只有一个文件比在整个仓库中存储多个文件要简单得多。是否有标准的最佳实践或在线分析其中一种方法优于另一种方法?

Answers:


254

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

  • 不同的目录具有不同类型的文件,可以忽略。例如,.gitignore项目顶部目录中的会忽略生成的程序,而Documentation/.gitignore忽略生成的文档。

  • 仅忽略给定(子)目录中的给定文件(不过,您可以/sub/foo在中使用.gitignore)。

请记住,.gitignore文件中的模式会递归地应用于文件所在的(子)目录及其所有子目录,除非pattern包含'/'(例如,pattern name应用于给name定目录及其所有子目录中命名的任何文件,而/name适用于file仅在给定目录中使用此名称)。


1
嗯,出于某种原因,我认为/Documentation/*.html可以解决这个问题,但是我想*通配符只能匹配一级目录。
康利·欧文斯

9
@ConleyOwens:您可以使用现代Git Documentation/**/*.html(请注意,任何斜杠均会锚定该模式;该斜杠/foo用于直接在目录中锚定文件)
JakubNarębski2014年

97

切记,拥有多个.gitignore文件的功能非常有用的一种情况是,如果您想要在工作副本中增加一个您不想提交的目录。只需.gitignore在该目录中放入一个1字节(仅包含一个星号),它就永远不会显示在git status等等中。


4
你也可以使用“git的/信息/排除”该文件
Ayell

10
当然,如果您不介意必须在存储库根目录之外的某个位置打开文件,然后在其中写入完整路径,然后记得在删除目录时记住清理条目,那么就很麻烦了。与之比较printf \* > .gitignore(删除目录时自动清除)。我敢肯定,在某些情况下.git/info/exclude,更合适的选择是,但并不很多。
亚里斯多德·帕加尔兹

是的,例如,当您要排除文件而不是文件夹时:p
Ayell,2016年

4
我在回答中说:“如果您想要在工作副本中增加一个您永远不想提交的目录”。
亚里斯多德·帕加尔兹

1
由于它在根.gitignore中减少了混乱,因此我非常喜欢这种方法。
戴维·A·格雷,

59

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

.gitignore每个分支可以有不同版本的文件:我已经看过这种配置,可以确保一个分支忽略一个文件,而另一个分支则不会:例如,请参见此问题

如果您的仓库包含多个独立项目,则最好将它们作为子模块引用。
那将是实际的最佳做法,允许每个项目被独立克隆(带有各自的.gitignore文件),同时被全局父项目中的特定修订版本引用。
有关更多信息,请参见子模块的本质


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


17

专业单身

  • 容易找到。

  • 如果我在仓库中有多个级别的多个gitignore,则寻找排除规则可能会非常困难。

  • 使用多个文件时,通常还会出现相当多的重复。

专业版

  • 将“知识”范围扩展到文件树中需要它的部分。

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

    (和Git 1.8之前,只有这样,才能排除格式,如:my/**.example是建立my/.gitignore在与图案**.foo,这理由现在不适用,因为你可以做/my/**/*.example。)


我更喜欢一个文件,可以在其中找到所有排除项。我从未错过过每目录.svn,也不会错过每目录.gitignore。

也就是说,多个gitignores很常见。如果确实使用它们,则至少在使用它们时要保持一致,以使其合理使用。例如,您可以将它们放在根目录下仅一级的目录中。


“空的.gitignore是提交“空”目录的唯一方法。” 实际上,我发现上载单个README文件(或empty为此命名的文件)更为常见。
Marc.2377

6
.gitkeep也是执行此操作的一种好方法……只是另一种约定。我喜欢使用自述文件的想法,因为这样您可以在该自述文件中解释目录的用途。
加文·

8

有些情况下,你要提交的目录到你的Git回购,但没有在它的文件中许多场景,例如logscacheuploads目录等。

因此,我始终要做的是.gitignore在这些目录中添加具有以下内容的文件:

*
!.gitignore

有了这个.gitignore文件,Git将不会跟踪那些目录中的任何文件,但仍然允许我将.gitignore文件添加到目录中,从而将目录本身添加到仓库中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.