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

问题描述 投票:1396回答:20

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

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

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

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...
git gitignore
20个回答
2075
投票

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

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

9
投票

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

不起作用:

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

作品:

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

8
投票

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

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

7
投票

我有来自凉亭的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

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


6
投票

我尝试了上面给出的所有答案,但没有一个对我有用。在阅读gitignore文档(here)后,我发现如果您首先排除文件夹,则子文件夹中的文件名未被索引。因此,如果您之后使用感叹号来包含文件,则它在索引中找不到,因此不会包含在您的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/

否则它不会按预期工作。


6
投票

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

正如@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主持了这个项目的详细说明。

Usage Example

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

Output

!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

There's also a simple web version available here

谢谢。


4
投票

如果您需要忽略除少数文件和少数根文件夹之外的所有内容

/*
!.gitignore
!showMe.txt
!my_visible_dir

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


4
投票

我就是这样做的:

# 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,您只能看到文件夹,这可能会让您误以为它们内部的所有内容都被跟踪


3
投票

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

这不起作用:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

这有效:

build/*
!build/libs

3
投票

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

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

显示了我用这种方式排除的两个文件:

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

最后,这对我有用:

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

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

此外,似乎陈述的顺序无关紧要。相反,您需要明确否定所有子文件夹,然后才能否定其中的单个文件。

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

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


2
投票

我得到了这个工作

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib

570
投票

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

的.gitignore

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

0
投票

我似乎发现了一些对我有用的东西,没有人提到过。

# Ignore everything
*

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

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

基本上,它似乎否定了一个子目录被忽略,你必须有两个条目,一个用于子目录本身!subdir/,然后另一个扩展到它下面的所有文件和文件夹!subdir/**/*


204
投票

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

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

# 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


68
投票

更具体一点:

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

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

失败

webroot/cache*
!webroot/cache/.htaccess

作品

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

53
投票
# ignore these
*
# except foo
!foo

25
投票

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

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

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

失败

application/*

!application/config/*

!application/index.php

作品

!application/config/*

!application/index.php

application/*


19
投票

您可以使用git config status.showUntrackedFiles no,并且将隐藏所有未跟踪的文件。有关详细信息,请参阅man git-config


14
投票

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

!app/

app/*
!app/bower_components/

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

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


13
投票

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

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

# 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

这些是有用的主题:

我也试过了

*
*/*
**/**

**/wp-content/themes/**

或者/wp-content/themes/**/*

这些也不适用于我。大量的反复试验!

© www.soinside.com 2019 - 2024. All rights reserved.