多个`.gitignore的皱眉?

Con*_*ens 205 git

除非一个回购包含几个独立的项目,否则在回购.gitignore的根部只有一个文件比在整个过程中只有一个文件是最简单的.当在一种方法比另一种方法更好时,是否有关于此或在线分析的标准最佳实践?

Jak*_*ski 223

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

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

  • 忽略指定的文件只能在给定的(子)目录(可以使用/sub/foo.gitignore,虽然).

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

  • @ConleyOwens:使用现代Git,您可以使用`Documentation/**/*.html`(请注意,任何斜杠都会锚定模式;`/ foo`用于直接在目录中锚定文件) (9认同)
  • 啊,出于某种原因,我认为 /Documentation/*.html 会涵盖这一点,但我猜 * 通配符只会匹配一个级别的目录。 (2认同)
  • 第三种情况:从例如“yarn”生成“.gitignore”:更容易将其保留在生成的位置,而且生成工具可以作为更新或配置更改的一部分进一步修改它。 (2认同)

Ari*_*zis 88

作为一个相关的注释,一个具有多个.gitignore文件的能力非常有用的情况是,如果您想在工作副本中创建一个您从未打算提交的额外目录.只需.gitignore在该目录中放一个1字节(只包含一个星号),它就不会出现在git status等等中.

  • 当然,如果您不介意必须在存储库根目录下的某个位置打开文件,然后将整个路径写入其中,然后记住在删除目录时清除条目.将其与`printf\*> .gitignore`进行比较(删除目录时自动清理).我确信有些情况下`.git/info/exclude`是更合适的选择,但并不多. (9认同)
  • 您也可以使用“ .git / info / exclude”文件 (4认同)
  • 在我的回答中,我说"如果你想在工作副本中有一个额外的目录,你永远不想提交". (4认同)

Von*_*onC 51

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

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

如果您的仓库包含多个独立项目,则最好将它们作为子模块引用.
这将是实际的最佳实践,允许每个项目独立克隆(使用各自的.gitignore文件),同时由全局父项目中的特定修订引用.
有关更多信息,请参阅子模块的真实性质.


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


Pau*_*per 15

亲单

  • 容易找到.

  • 如果我在回购中的多个级别拥有多个gitignore,那么查找排除规则可能会非常困难.

  • 对于多个文件,您通常也会遇到相当多的重复.

亲倍多

  • 将"知识"范围扩展到需要它的文件树部分.

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

    (和Git 1.8之前,要排除的模式类似的唯一方法my/**.example是创建my/.gitignore与图案**.foo,这理由现在不适用,因为你可以做/my/**/*.example.)


我更喜欢单个文件,在那里我可以找到所有排除项.我从来没有错过每个目录.svn,我也不会错过每个目录.gitignore.

也就是说,多个gitignores很常见.如果你确实使用它们,至少要保持一致,以使它们合理使用.例如,您可以将它们放在仅与根目录相同的目录中.

  • .gitkeep是一个很好的方式来做这个...只是另一个约定.我喜欢使用自述文件的想法,因为那样你就可以在那个自述文件中解释目录的用途. (5认同)
  • “空的 .gitignore 是提交“空”目录的唯一方法。” 实际上,我发现上传单个自述文件(或就此而言名为“空”的文件)更为常见。 (2认同)

Luk*_*man 5

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

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

*
!.gitignore
Run Code Online (Sandbox Code Playgroud)

使用此.gitignore文件,Git将不会跟踪这些目录中的任何文件,但仍然允许我将.gitignore文件添加到repo中,因此目录本身也是如此.


see*_*per 5

子文件夹中的另一个用例.gitignore是在 monorepos 中,其中每个存储库指定应忽略哪些文件可能更合适,而不是将它们全部移动到单个大型文件中.gitignore,然后再深入到每个项目中。

示例:我们有一个基于nx构建系统的 monorepo。在它里面我们有一个tools文件夹,其中包含各种实用程序,其中一些本身就是小型独立项目。在这种情况下,每个工具(package.json例如有自己的工具)也有一个单独的.gitignore. 它更容易维护,并且开发人员更容易了解正在发生的事情。