使. gitignore 忽略除少数文件以外的所有内容

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

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

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

# Ignore everything
*

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

答案

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

# 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

.gitignore

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

在大多数情况下,您想使用/*代替**/

使用*是有效的,但是它可以递归工作。从此以后,它就不再查找目录。人们建议再次使用!*/将目录列入白名单,但最好使用/*将最高级别的文件夹列入黑名单

# 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文件夹后的斜杠(/):

失败

webroot/cache*
!webroot/cache/.htaccess

作品

webroot/cache/*
!webroot/cache/.htaccess
# 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 中排除文件夹,可以执行以下操作。

!app/

app/*
!app/bower_components/

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

除了/highcharts之外,这将忽略bower_components内部的所有文件 / 子文件夹。

关于此还有很多类似的问题,因此我将发布我之前写的内容:

我在计算机上使用此方法的唯一方法是这样做:

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

这些都不对我有用。很多的跟踪和错误!

我的子文件夹有问题。

不起作用:

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

作品:

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