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 |
上述代码将忽略除
很明显,我也可以这样做,例如,
更多信息:http://git-scm.com/docs/gitignore
更具体一点:
示例:忽略
注意
失败
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"之外的所有内容,注意顺序。
你必须先否定你想要的东西。
失败
作品
您可以使用
要从.gitignore中排除文件夹,可以执行以下操作。
1 2 3 4 5 6 7 | !app/ app/* !app/bower_components/ app/bower_components/* !app/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 | * */* **/** |
和
或
这对我也没用。很多线索和错误!
子文件夹有问题。
不起作用:
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在
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 |
但是,如果文件在嵌套目录中,那么手动编写规则有点困难。
例如,如果我们想跳过
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 |
上述给定的
正如您可能已经注意到的,很难定义这些规则。
为了解决这个障碍,我创建了一个简单的控制台应用程序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 |
关键是首先否定文件夹
而且,似乎陈述的顺序并不重要。相反,您需要显式地否定所有子文件夹,然后才能否定其中的单个文件。
文件夹
伟大的线索!这个问题困扰了我一段时间;)
我有这个工作
1 2 3 | # Vendor /vendor/braintree/braintree_php/* !/vendor/braintree/braintree_php/lib |