多个`.gitignore'皱起了眉头?
除非一个回购包含了几个独立的项目,否则在整个回购的根目录下只有一个.gitignore
文件是最简单的。 有没有一个标准的最佳做法,或在线分析,当一种方法比另一种更好?
我可以想到至less有两种情况,你想在不同的(子)目录中有多个.gitignore
文件。
-
不同的目录有不同types的文件要忽略。 例如,项目顶部目录中的
.gitignore
忽略生成的程序,而Documentation/.gitignore
忽略生成的文档。 -
忽略给定的文件只在给定的(子)目录(你可以在
/sub/foo
.gitignore
使用/sub/foo
)。
请记住, .gitignore
文件中的模式recursion地应用于文件所在的(子)目录及其所有子目录,除非模式包含“/”(例如,模式name
适用于给定目录及其所有子目录中名为name
任何文件,而/name
适合只在给定的目录中使用这个名称)。
作为一个切合点,一个能够拥有多个.gitignore
文件的例子非常有用,那就是如果你想在你的工作副本中添加一个额外的目录,而这个目录是你永远不想提交的。 只要在该目录中放置一个1字节的.gitignore
(只包含一个星号),它就不会在git status
显示出来。
你可以有多个.gitignore
,每个当然都在它自己的目录中。
要检查哪个gitignore规则负责忽略文件,请使用git check-ignore
: git check-ignore -v -- afile
。
每个分支可以有一个不同版本的.gitignore
文件:我已经看到了这种configuration,以确保一个分支忽略一个文件,而另一个分支不会: 例如看到这个问题 。
如果您的回购包含多个独立项目,最好将其作为子模块引用。
这将是实际的最佳实践,允许每个项目独立克隆(与其各自的.gitignore
文件),同时被全球父项目中的特定修订引用。
更多地了解子模块的真实性质 。
请注意,自从git 1.8.2(2013年3月)以来,您可以执行git check-ignore -v -- yourfile
来查看哪个gitignore运行(从哪个.gitignore
文件)应用于“ yourfile
”,并更好地理解为什么所述文件被忽略。
请参阅“ 哪个gitignore
规则忽略了我的文件?
临单
-
容易find。
-
如果我有多个gitignore,在回购的几个级别,狩猎排除规则可能是相当困难的。
-
对于多个文件,通常也会有一些重复。
赞成多个
-
范围“知识”到需要文件树的部分。
-
由于Git只跟踪文件,空的.gitignore是提交“空”目录的唯一方法。
(在Git 1.8之前,排除像
my/**.example
这样的模式的唯一方法就是使用模式my/**.example
my/.gitignore
创buildmy/.gitignore
,这个理由现在不适用,因为你可以/my/**/*.example
。)
我更喜欢一个文件,我可以find所有的排除。 我从来没有错过每个目录.svn,我也不会错过每个目录.gitignore。
也就是说,多个gitignores是相当普遍的。 如果你确实使用它们,至less应该保持一致,以使其合理使用。 例如,您可以将它们放在根目录中的一个级别的目录中。
有很多情况下,你想提交一个目录到你的Git仓库,但没有它的文件,例如logs
, cache
, uploads
目录等。
所以我总是做的是在这些包含以下内容的目录中添加一个.gitignore
文件:
* !.gitignore
有了这个.gitignore
文件,Git将不会跟踪这些目录中的任何文件,但仍然允许我将.gitignore
文件以及目录本身添加到回购。