关于git:Make .gitignore会忽略除少数文件之外的所有内容

Make .gitignore ignore everything except a few files

我知道.gitignore文件隐藏了来自git版本的指定文件控制。我有一个项目(LaTex),可以生成很多额外的文件(.auth,.dvi、.pdf、日志等),但我不希望跟踪这些内容。

我知道我可以(也许应该)把所有的文件放在在项目中分离子文件夹,因为我可以忽略该文件夹。

但是,是否有任何可行的方法将输出文件保存在项目树并使用.gitignore忽略除文件之外的所有内容用Git追踪?类似的东西

1
2
3
4
5
6
7
# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...


An optional prefix ! which negates the pattern; any matching file excluded by
a previous pattern will become included again. If a negated pattern matches,
this will override lower precedence patterns sources.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*


如果要忽略目录中除一个文件以外的所有内容,可以为文件路径中的每个目录编写一对规则。例如,gitignore忽略pippo文件夹,pippo/pluto/paperino.xml除外。

吉蒂格诺

1
2
3
4
pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml


在大多数情况下,您希望使用/*,而不是**/

使用*是有效的,但它是递归工作的。从那时起它就不会查看目录。人们建议再次使用!*/来白名单目录,但实际上最好用/*来黑名单最高级的文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing"/" is optional for folders, may match file though.
#"/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

上述代码将忽略除.gitignoreREADME.mdfolder/a/file.txtfolder/a/b1/folder/a/b2/以外的所有文件以及最后两个文件夹中包含的所有内容。(在这些文件夹中,.DS_Store*.log文件将被忽略。)

很明显,我也可以这样做,例如,!/folder!/.gitignore

更多信息:http://git-scm.com/docs/gitignore


更具体一点:

示例:忽略webroot/cache中的所有内容,但保留webroot/cache/.htaccess

注意cache文件夹后面的斜线(/):

失败

1
2
webroot/cache*
!webroot/cache/.htaccess

作品

1
2
webroot/cache/*
!webroot/cache/.htaccess


1
2
3
4
# ignore these
*
# except foo
!foo

要忽略目录中的某些文件,必须按正确的顺序执行此操作:

例如,忽略文件夹"application"中除index.php和文件夹"config"之外的所有内容,注意顺序。

你必须先否定你想要的东西。

失败

application/*

!application/config/*

!application/index.php

作品

!application/config/*

!application/index.php

application/*


您可以使用git config status.showUntrackedFiles no,所有未跟踪的文件都将对您隐藏。详见man git-config


要从.gitignore中排除文件夹,可以执行以下操作。

1
2
3
4
5
6
7
!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

这将忽略bower_components中除/highcharts外的所有文件/子文件夹。


关于这一点,有许多类似的问题,所以我将发布我之前写的内容:

我让它在我的机器上工作的唯一方法是这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory
#(This fails to ignore files without a".", for example
#'file.txt' works, but
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories and files if you wish:
!wordpress/somefile.jpg
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

请注意,您必须明确地为要包括的每个级别允许内容。所以如果我在主题下面有5个子目录,我仍然需要把它拼出来。

这是来自@yarin的评论:https://stackoverflow.com/a/5250314/1696153

这些是有用的主题:

  • 否定模式如何在.gitignore中工作?
  • GitIgnore排除规则实际上如何工作?

我也尝试过

1
2
3
*
*/*
**/**

**/wp-content/themes/**

/wp-content/themes/**/*

这对我也没用。很多线索和错误!


子文件夹有问题。

不起作用:

1
2
/custom/*
!/custom/config/foo.yml.dist

作品:

1
2
/custom/config/*
!/custom/config/foo.yml.dist

这就是我的工作,我只想向repo提交一个cordova插件:

1
2
3
...
plugins/*
!plugins/cordova-plugin-app-customization


我有来自鲍尔的jquery和angular。鲍尔安装了它们

1
2
3
/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

最小化jquery在dist目录中,angular在angular目录中。我只需要将最小化的文件提交到Github。一些篡改。gitignore,这是我设法变出的……

1
2
3
4
5
6
/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

希望有人能找到这个有用的。


我试过上面给出的所有答案,但没有一个对我有用。在阅读了gitignore文档(这里)之后,我发现如果首先排除一个文件夹,那么子文件夹中的文件名就不会被索引。因此,如果之后使用感叹号来包含文件,则在索引中找不到该文件,因此不会包含在Git客户机中。

这就是找到解决方案的方法。我开始为文件夹树中的所有子文件夹添加异常以使其正常工作,这是一项非常糟糕的工作。之后,我能够将详细的配置压缩为下面的配置,这与文档有点矛盾。

正在工作.gitignore:

1
2
3
4
5
6
7
8
9
10
11
# Ignore the 'Pro' folder, except for the '3rdparty' subfolder
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

结果,我在我的Git客户机中看到,只有pro/3rdparty/domain/modulename/文件夹中的两个文件正在为下一次提交进行准备,这正是我要查找的。

如果您需要将同一文件夹的几个子文件夹白名单出来,那么将exclude语句下面的感叹号行按如下方式分组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Ignore the 'Pro' folder, except for the '3rdparty' subfolder
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

否则它将无法按预期工作。


我知道我参加聚会迟到了,但这是我的答案。

正如@joakim所说,要忽略一个文件,您可以使用下面这样的内容。

1
2
3
4
5
6
# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

但是,如果文件在嵌套目录中,那么手动编写规则有点困难。

例如,如果我们想跳过git项目中的所有文件,而不是位于aDir/anotherDir/someOtherDir/aDir/bDir/cDir中的a.txt。那么,我们的.gitignore就是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

上述给定的.gitignore文件将跳过除!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt以外的所有目录和文件。

正如您可能已经注意到的,很难定义这些规则。

为了解决这个障碍,我创建了一个简单的控制台应用程序Git Do Not Ignore,它将为您生成规则。我已经在Github主持了这个项目,并提供了详细的说明。

使用实例

1
java -jar git-do-not-ignore.jar"aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

产量

1
2
3
4
5
6
7
8
9
10
11
12
13
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

这里还有一个简单的网络版本

谢谢您。


到目前为止,没有什么对我有用的,因为我正试图从lib添加一个jar。

这不起作用:

1
2
3
4
build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar

这起作用了:

1
2
build/*
!build/libs

如果需要忽略除少数文件和少数根文件夹以外的所有内容,请使用简单的解决方案:

1
2
3
4
/*
!.gitignore
!showMe.txt
!my_visible_dir

魔法在/*中(如上所述),它忽略(根)文件夹中的所有内容,但不递归。


我对单个文件的否定也有一些问题。我可以提交它们,但是我的IDE(intellij)总是抱怨忽略的文件,这些文件被跟踪。

1
git ls-files -i --exclude-from .gitignore

显示了这两个文件,我以这种方式排除了它们:

1
2
3
public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

最后,这对我很有用:

1
2
3
4
5
public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

关键是首先否定文件夹typo3conf/

而且,似乎陈述的顺序并不重要。相反,您需要显式地否定所有子文件夹,然后才能否定其中的单个文件。

文件夹!public/typo3conf/和文件夹内容public/typo3conf/*是.gitignore的两种不同内容。

伟大的线索!这个问题困扰了我一段时间;)


我有这个工作

1
2
3
# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib