【问题标题】:Are multiple `.gitignore`s frowned on?多个`.gitignore`s皱眉吗?
【发布时间】:2010-07-22 04:56:21
【问题描述】:

除非一个 repo 由几个独立的项目组成,否则似乎在 repo 的根目录下只有一个 .gitignore 文件比在整个过程中的各种文件更简单。是否有标准的最佳实践或在线分析一种方法何时优于另一种?

【问题讨论】:

    标签: git


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 啊,出于某种原因,我认为 /Documentation/*.html 会涵盖这一点,但我猜 * 通配符只会匹配一级目录。
    • @ConleyOwens:在现代 Git 中,您可以使用 Documentation/**/*.html(请注意,任何斜线都会锚定模式;/foo 用于将文件直接锚定在目录中)
    • 第三种情况:从例如生成.gitignore yarn:更容易将其留在生成的位置,而且生成工具可能会在更新或配置更改时进一步修改它。
    • 由于您对使用“Documentation/**/*.html”和“/sub/foo”的评论,您让我相信,我可能不会想创建多个 .gitignore文件。 (除了那些自动生成的)
    • @JohnPankowicz :我认为是将所有模式放在一个大的.gitignore 文件中,还是将所有模式放在一个大的.gitignore 文件中,或者将单独的.gitignore 文件用于单独的子系统/单独的部分及其自己的规则。
    【解决方案2】:

    顺便说一句,拥有多个.gitignore 文件的能力非常有用的一种情况是,如果您想要在工作副本中添加一个您从未打算提交的额外目录。只需在该目录中放置一个 1 字节的 .gitignore(仅包含一个星号),它就不会出现在 git status 等中。

    【讨论】:

    • 你也可以使用“.git/info/exclude”文件
    • 当然,如果您不介意必须在存储库根目录之外的某个位置打开文件,然后将整个路径写入其中,然后记得清理条目,如果/当你删除目录时。将其与printf \* > .gitignore 进行比较(删除目录时会自动进行清理)。我敢肯定在某些情况下.git/info/exclude 是更合适的选择,但并不多。
    • 是的,例如当您想排除文件而不是文件夹时:p
    • 我在回答中说“如果你想在你的工作副本中添加一个你从未打算提交的额外目录”。
    • 由于它在根 .gitignore 中创建的混乱更少,我非常喜欢这种方法。
    【解决方案3】:

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

    每个分支可以有不同版本的.gitignore 文件:我已经看到了确保一个分支忽略文件而另一个分支不忽略的那种配置:请参阅question for instance

    如果您的 repo 包含多个独立项目,最好将它们引用为 子模块
    这将是实际的最佳实践,允许独立克隆每个项目(使用它们各自的 .gitignore 文件),同时被全局父项目中的特定修订版引用。
    请参阅true nature of submodules 了解更多信息。


    请注意,从 git 1.8.2(2013 年 3 月)开始,您可以执行 git check-ignore -v -- yourfile 以查看哪个 gitignore 运行(来自哪个 .gitignore 文件)应用于“yourfile”,并更好地理解原因所述文件被忽略。
    见“which gitignore rule is ignoring my file?

    【讨论】:

      【解决方案4】:

      专业单曲

      • 很容易找到。

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

      • 如果有多个文件,通常还会产生大量重复。

      专业倍数

      • 将“知识”限定到文件树中需要它的部分。

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

        (在 Git 1.8 之前,排除像 my/**.example 这样的模式的唯一方法是在模式 **.foo 中创建 my/.gitignore。这个原因现在不适用,你可以这样做 /my/**/*.example。 )


      我更喜欢单个文件,我可以在其中找到所有排除项。我从来没有错过 per-directory .svn,我也不会错过 per-directory .gitignore。

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

      【讨论】:

      • "一个空的 .gitignore 是提交一个“空”目录的唯一方法。"实际上,我发现上传单个 README 文件(或就此而言名为 empty 的文件)更为常见。
      • .gitkeep 也是一个很好的方法......只是另一个约定。我喜欢使用自述文件的想法,因为这样您就可以在自述文件中解释目录的用途。
      • @GavinPickin:由于.gitignore 中有 cmets,它是恕我直言的货物 .keep 的自我记录变体(b/c 这是另一个已解决的“问题”约定通过 git 在 git 中,不需要另一个元/特殊文件)。文件注释显示意图,忽略所有,然后不忽略忽略文件本身并完成。任何好奇该目录的人,只需查看该文件即可。这样,它也鼓励使用自我解释的目录名称,并且也不妨碍在根目录中使用自述文件。
      【解决方案5】:

      在许多情况下,您希望将目录提交到 Git 存储库但其中没有文件,例如 logscacheuploads 目录等。

      所以我总是在这些目录中添加一个.gitignore 文件,内容如下:

      # this directory is intentionally ignored
      /*
      !/.gitignore
      

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

      【讨论】:

      • 我也非常喜欢这种使用模式,它是一个非常好的经验法则,并且(只是进行了编辑以使其显而易见)您还可以添加评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2022-11-09
      • 2015-04-21
      • 1970-01-01
      • 2017-12-05
      • 2014-11-12
      相关资源
      最近更新 更多