【发布时间】:2010-07-22 04:56:21
【问题描述】:
除非一个 repo 由几个独立的项目组成,否则似乎在 repo 的根目录下只有一个 .gitignore 文件比在整个过程中的各种文件更简单。是否有标准的最佳实践或在线分析一种方法何时优于另一种?
【问题讨论】:
标签: git
除非一个 repo 由几个独立的项目组成,否则似乎在 repo 的根目录下只有一个 .gitignore 文件比在整个过程中的各种文件更简单。是否有标准的最佳实践或在线分析一种方法何时优于另一种?
【问题讨论】:
标签: git
我至少可以想到两种情况,您希望在不同的(子)目录中拥有多个 .gitignore 文件。
不同的目录有不同类型的文件需要忽略。例如,项目顶层目录中的.gitignore 会忽略生成的程序,而Documentation/.gitignore 会忽略生成的文档。
只忽略给定(子)目录中的给定文件(不过,您可以在.gitignore 中使用/sub/foo)。
请记住.gitignore文件中的模式递归地应用于文件所在的(子)目录及其所有子目录,除非模式包含'/'(例如,模式name适用于任何名为name的文件在给定目录及其所有子目录中,而/name 仅适用于给定目录中具有此名称的文件。
【讨论】:
Documentation/**/*.html(请注意,任何斜线都会锚定模式;/foo 用于将文件直接锚定在目录中)
.gitignore yarn:更容易将其留在生成的位置,而且生成工具可能会在更新或配置更改时进一步修改它。
.gitignore 文件中,还是将所有模式放在一个大的.gitignore 文件中,或者将单独的.gitignore 文件用于单独的子系统/单独的部分及其自己的规则。
顺便说一句,拥有多个.gitignore 文件的能力非常有用的一种情况是,如果您想要在工作副本中添加一个您从未打算提交的额外目录。只需在该目录中放置一个 1 字节的 .gitignore(仅包含一个星号),它就不会出现在 git status 等中。
【讨论】:
printf \* > .gitignore 进行比较(删除目录时会自动进行清理)。我敢肯定在某些情况下.git/info/exclude 是更合适的选择,但并不多。
您可以拥有多个.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?”
【讨论】:
专业单曲
很容易找到。
如果我有多个 gitignore,在 repo 中的多个级别查找排除规则可能会非常困难。
如果有多个文件,通常还会产生大量重复。
专业倍数
将“知识”限定到文件树中需要它的部分。
由于 Git 只跟踪文件,一个空的 .gitignore 是提交“空”目录的唯一方法。
(在 Git 1.8 之前,排除像 my/**.example 这样的模式的唯一方法是在模式 **.foo 中创建 my/.gitignore。这个原因现在不适用,你可以这样做 /my/**/*.example。 )
我更喜欢单个文件,我可以在其中找到所有排除项。我从来没有错过 per-directory .svn,我也不会错过 per-directory .gitignore。
也就是说,多个 gitignore 很常见。如果您确实使用它们,至少在使用它们时保持一致,以使它们合理地使用。例如,您可以将它们放在距根仅一层的目录中。
【讨论】:
empty 的文件)更为常见。
.gitignore 中有 cmets,它是恕我直言的货物 .keep 的自我记录变体(b/c 这是另一个已解决的“问题”约定通过 git 在 git 中,不需要另一个元/特殊文件)。文件注释显示意图,忽略所有,然后不忽略忽略文件本身并完成。任何好奇该目录的人,只需查看该文件即可。这样,它也鼓励使用自我解释的目录名称,并且也不妨碍在根目录中使用自述文件。
在许多情况下,您希望将目录提交到 Git 存储库但其中没有文件,例如 logs、cache、uploads 目录等。
所以我总是在这些目录中添加一个.gitignore 文件,内容如下:
# this directory is intentionally ignored
/*
!/.gitignore
有了这个 .gitignore 文件,Git 将不会跟踪这些目录中的任何文件,但仍然允许我添加 .gitignore 文件,从而将目录本身添加到 repo。
【讨论】: