当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Make.gitignore会忽略除少数文件之外的所有内容》经验,为你挑选了16个好方法。

我知道.gitignore文件隐藏了Git版本控制中指定的文件.我有一个项目(LaTeX),它在运行时会生成许多额外的文件(.auth,.dvi,.pdf,日志等),但我不希望这些文件被跟踪.

我知道我可以(也许应该)这样做所有这些文件放在项目中的一个单独的子文件夹中,因为我可以忽略该文件夹.

但是,有没有可行的方法将输出文件保存在项目树的根目录中,并使用.gitignore忽略除了我用Git跟踪的文件之外的所有内容?就像是

# Ignore everything
*

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

Joakim Elofs.. 2204

一个!否定模式的可选前缀; 之前模式排除的任何匹配文件将再次包含在内.如果否定模式匹配,则将覆盖较低优先级模式源.

# 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/*

@PandaWood这个问题提到了[这里](http://stackoverflow.com/questions/9162919/git-whitelisting-files-in-a-complex-directory-structure)(stackoverflow.com).这是由第一个表达式匹配所有内容引起的,包括目录,你永远不会否定.要修复,添加(!*/),它匹配当前目录中的所有子目录(递归).这对父答案没有帮助,即将特定文件列入白名单(如果它们在子目录中,您可能希望手动指定完整路径,或使用特定于目录的.gitignore文件). (38认同)

我无法让这个工作.我忽略了一个文件夹(例如`wp /`),但我不想忽略该文件夹中的一些文件(例如`wp/path/to/some/location/*`).我可以让它工作的唯一方法是`git add -f wp/path/to/some/location/*` (33认同)

看起来这也"忽略"子文件夹,这样任何名称为'script.pl'的文件都不会在根目录中找到.我现在正在使用它(使用*.pl)并且所有*.pl文件都被忽略,即使.gitignore文件下面的子目录中有很多文件也被忽略 (11认同)

@trusktr使用simont的`!*/`异常 (11认同)

最后一条规则的Geez:`!*/`在我徒劳地尝试争论一个`.gitignore`文件工作方面发挥了重要作用.非常感谢你. (3认同)

@huyz不是真的,当.gitignore在repo里面时它的变化不会被忽略(和所有文件一样)..gitignore在添加之前忽略了自己,可以通过执行'git add -f .gitignore'(在尝试时提到)来解决. (2认同)


Giuseppe Gal.. 588

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

的.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

很好的答案,但值得注意的是,对于后来遇到这个问题的人来说,`foo`和`foo/*`**不是**相同.为此,你需要**使用`foo/*`作为基本文件夹 (49认同)

@Mayank Pippo是意大利语中的Goofy,而Paperino是唐老鸭,冥王星和英语一样.过去,他们曾经是一个非常常见的变量名三元组,用于编程样本.很高兴再次阅读它们.. :) (19认同)

对我不起作用:node_modules/*!node_modules/bootstrap (6认同)


Ryan Taylor.. 220

您想要使用/*而不是**/在大多数情况下使用

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

# 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

上面的代码会忽略所有的文件,除了.gitignore,README.md,folder/a/file.txt,folder/a/b1/folder/a/b2/和包含在那些过去的两个文件夹的一切.(和.DS_Store*.log文件将这些文件夹中被忽略.)

显然我可以做!/folder或不做!/.gitignore.

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



1> Joakim Elofs..:

一个!否定模式的可选前缀; 之前模式排除的任何匹配文件将再次包含在内.如果否定模式匹配,则将覆盖较低优先级模式源.

# 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/*


@PandaWood这个问题提到了[这里](http://stackoverflow.com/questions/9162919/git-whitelisting-files-in-a-complex-directory-structure)(stackoverflow.com).这是由第一个表达式匹配所有内容引起的,包括目录,你永远不会否定.要修复,添加(!*/),它匹配当前目录中的所有子目录(递归).这对父答案没有帮助,即将特定文件列入白名单(如果它们在子目录中,您可能希望手动指定完整路径,或使用特定于目录的.gitignore文件).
我无法让这个工作.我忽略了一个文件夹(例如`wp /`),但我不想忽略该文件夹中的一些文件(例如`wp/path/to/some/location/*`).我可以让它工作的唯一方法是`git add -f wp/path/to/some/location/*`
看起来这也"忽略"子文件夹,这样任何名称为'script.pl'的文件都不会在根目录中找到.我现在正在使用它(使用*.pl)并且所有*.pl文件都被忽略,即使.gitignore文件下面的子目录中有很多文件也被忽略
@trusktr使用simont的`!*/`异常
最后一条规则的Geez:`!*/`在我徒劳地尝试争论一个`.gitignore`文件工作方面发挥了重要作用.非常感谢你.
@huyz不是真的,当.gitignore在repo里面时它的变化不会被忽略(和所有文件一样)..gitignore在添加之前忽略了自己,可以通过执行'git add -f .gitignore'(在尝试时提到)来解决.

2> Giuseppe Gal..:

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

的.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml


很好的答案,但值得注意的是,对于后来遇到这个问题的人来说,`foo`和`foo/*`**不是**相同.为此,你需要**使用`foo/*`作为基本文件夹
@Mayank Pippo是意大利语中的Goofy,而Paperino是唐老鸭,冥王星和英语一样.过去,他们曾经是一个非常常见的变量名三元组,用于编程样本.很高兴再次阅读它们.. :)
对我不起作用:node_modules/*!node_modules/bootstrap

3> Ryan Taylor..:

您想要使用/*而不是**/在大多数情况下使用

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

# 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

上面的代码会忽略所有的文件,除了.gitignore,README.md,folder/a/file.txt,folder/a/b1/folder/a/b2/和包含在那些过去的两个文件夹的一切.(和.DS_Store*.log文件将这些文件夹中被忽略.)

显然我可以做!/folder或不做!/.gitignore.

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


我内在的语法荧光笔对你帖子的标题有一种奇怪的反应.
非常聪明,谢谢.IMO,这是使用最少包含规则的WordPress网站的最佳方式.此外,未经您的明确许可,不会删除或添加任何新的插件,主题或WP更新.使用GitHub Desktop时,我发现`.DS_Store`文件不会被忽略,但是通过命令行这不是问题.为了解决这个问题,我不得不将"**/.DS_Store"移到所有其他规则之下.
格拉西亚斯!您还可以将文件夹中的文件列入白名单..!/some/folder/file.txt

4> Nik..:

更具体一点:

示例:忽略所有内容webroot/cache- 但请保留webroot/cache/.htaccess.

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

失败

webroot/cache*
!webroot/cache/.htaccess

作品

webroot/cache/*
!webroot/cache/.htaccess



5> Suvesh Prata..:
# ignore these
*
# except foo
!foo



6> slatunje..:

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

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

你必须首先否定你想要的东西.

失败

application/*

!application/config/*

!application/index.php

作品

!application/config/*

!application/index.php

application/*


错误.在"忽略一切"之后你否定了.
如果`git status`不会告诉你它在看什么以及什么被忽略,那你怎么知道这是否有效?

7> Robert Munte..:

您可以使用,git config status.showUntrackedFiles no并且将隐藏所有未跟踪的文件.详情man git-config请见.



8> 小智..:

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

!app/

app/*
!app/bower_components/

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

这将忽略bower_components除里面的所有文件/子文件夹/highcharts.



9> Katie..:

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

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

# 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排除规则如何实际运作?

我也试过了

*
*/*
**/**

**/wp-content/themes/**

要么 /wp-content/themes/**/*

这些也不适用于我.很多线索和错误!


这是唯一包含某些文件扩展名的唯一方法。更好的是,它使ASCII艺术变得很棒:https://gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1

10> Fabian Picon..:

我有一个子文件夹的问题.

不起作用:

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

作品:

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



11> Dmitry Sokur..:

这对我有用,我只想在回购中提交一个Cordova插件:

...
plugins/*
!plugins/cordova-plugin-app-customization



12> Mario Legend..:

我有来自凉亭的Jquery和Angular.鲍尔安装了它们

/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这就是我设法让人想起......

/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

希望有人能发现这个有用.



13> Tim B...:

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

这是找到解决方案的方法.我开始为我的文件夹树中的所有子文件夹添加例外以使其正常工作,这是一个很糟糕的工作.之后我能够将详细配置压缩到下面的配置,这与文档有点相反.

工作.gitignore:

# 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 /文件夹中的两个文件正在进行下一次提交,这正是我想要的.

如果您需要将同一文件夹的多个子文件夹列入白名单,请将排除语句下方的感叹号行分组,如下所示:

# 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/

否则它不会按预期工作.



14> theapache64..:

我知道我参加晚会很晚,但这是我的答案。

正如@Joakim所说,要忽略文件,可以使用以下内容。

# Ignore everything
*

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

但是,如果文件位于嵌套目录中,则手动编写规则会有点困难。

例如,如果我们要跳过git项目中的所有文件,而不是a.txt中的文件aDir/anotherDir/someOtherDir/aDir/bDir/cDir。然后,我们.gitignore将像这样

# 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上有详细的说明。

使用范例

java -jar git-do-not-ignore.jar "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

还有提供一个简单的Web版本在这里

谢谢。



15> zok..:

这是我的方法:

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

用于gig status -u递归地查看未跟踪目录中的单个文件- git status您只会看到文件夹,这可能使您误以为它们中的所有内容都已被跟踪



16> d.raev..:

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

/*
!.gitignore
!showMe.txt
!my_visible_dir

魔术已经存在/*(如上所述),它会(而不是递归)忽略(根)文件夹中的所有内容。

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有