据我所知,.gitignore文件隐藏了Git版本中指定的文件 控制。我有一个项目(LaTeX),生成大量额外的文件(.auth, .dvi,.pdf,日志等),因为它运行,但我不希望跟踪它们。
我知道我可以(也许应该)这样做所有这些文件放在一个 在项目中单独的子文件夹,因为我可以忽略该文件夹。
但是,是否有任何可行的方法将输出文件保留在。的根目录中 项目树和使用.gitignore忽略除我以外的文件以外的所有内容 用Git跟踪?像
这样的东西# Ignore everything
*
# But not these files...
script.pl
template.latex
# etc...
答案 0 :(得分:1984)
可选前缀
!
否定模式;排除的任何匹配文件 之前的模式将再次包含在内。如果否定模式匹配, 这将覆盖较低优先级模式源。
# 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/*
答案 1 :(得分:543)
如果要忽略除了其中一个文件的目录的全部内容,可以为文件路径中的每个目录编写一对规则。 例如.gitignore忽略pippo文件夹,除了pippo / pluto / paperino.xml
pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml
答案 2 :(得分:193)
You want to use /*
instead of *
or */
in most cases
Using *
is valid, but it works recursively. It won't look into directories from then on out. People recommend using !*/
to whitelist directories again, but it's actually better to blacklist the highest level folder with /*
# 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
The above code would ignore all files except for .gitignore
, README.md
, folder/a/file.txt
, folder/a/b1/
and folder/a/b2/
and everything contained in those last two folders. (And .DS_Store
and *.log
files would be ignored in those folders.)
Obviously I could do e.g. !/folder
or !/.gitignore
too.
More info: http://git-scm.com/docs/gitignore
答案 3 :(得分:68)
更具体一点:
示例:忽略webroot/cache
中的所有内容 - 但请保留webroot/cache/.htaccess
。
注意cache
文件夹后的斜杠(/):
<强>失败强>
webroot/cache*
!webroot/cache/.htaccess
<强> WORKS 强>
webroot/cache/*
!webroot/cache/.htaccess
答案 4 :(得分:53)
# ignore these
*
# except foo
!foo
答案 5 :(得分:26)
要忽略目录中的某些文件,您必须按正确的顺序执行此操作:
例如,忽略文件夹“application”中的所有内容,除了index.php和文件夹“config” 注意订单 。
你必须首先否定你想要的东西。
<强>失败强>
application/*
!application/config/*
!application/index.php
<强> WORKS 强>
!application/config/*
!application/index.php
application/*
答案 6 :(得分:19)
您可以使用git config status.showUntrackedFiles no
,并且将隐藏所有未跟踪的文件。有关详细信息,请参阅man git-config
。
答案 7 :(得分:14)
要从.gitignore中排除文件夹,可以执行以下操作。
!app/
app/*
!app/bower_components/
app/bower_components/*
!app/bower_components/highcharts/
除了bower_components
之外,这将忽略/highcharts
内的所有文件/子文件夹。
答案 8 :(得分:13)
遇到了与OP类似的问题,但被评选的前10个答案中没有一个真正起作用。
我终于发现了以下内容
语法错误:
*
!bin/script.sh
正确的语法:
*
!bin
!bin/script.sh
来自gitignore man page的解释:
可选的前缀“!”否定了模式;先前模式排除的所有匹配文件将再次包含在内。 如果排除了该文件的父目录,则无法重新添加该文件。由于性能原因,Git不会列出被排除的目录,因此所包含文件上的任何模式都无效,无论它们在何处定义。
这意味着上面的“语法错误”是错误的,因为bin/script.sh
不能被重新包含,因为bin/
被忽略了。就是这样。
扩展示例:
$树。
.
├── .gitignore
└── bin
├── ignore.txt
└── sub
└── folder
└── path
├── other.sh
└── script.sh
$ cat .gitignore
*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh
$ git status --untracked-files --ignored
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
bin/sub/folder/path/script.sh
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
bin/ignore.txt
bin/sub/folder/path/other.sh
nothing added to commit but untracked files present (use "git add" to track)
答案 9 :(得分:12)
关于这一点有很多类似的问题,所以我会发布我之前写的:
我在机器上工作的唯一方法就是这样做:
# 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/**/*
这些也不适用于我。大量的追踪和错误!
答案 10 :(得分:9)
我的子文件夹有问题。
不起作用:
/custom/*
!/custom/config/foo.yml.dist
使用:
/custom/config/*
!/custom/config/foo.yml.dist
答案 11 :(得分:8)
这对我有用,我只想在回购中提交一个Cordova插件:
...
plugins/*
!plugins/cordova-plugin-app-customization
答案 12 :(得分:7)
我有来自凉亭的Jquery和Angular。 Bower将它们安装在
中/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 :(得分:5)
我尝试了上面给出的所有答案,但没有一个对我有用。阅读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 /文件夹中的两个文件正在准备下一次提交,而这正是我想要的。
如果您需要将同一文件夹的多个子文件夹列入白名单,则将感叹号标记行分组在exclude语句下方,如下所示:
# 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 :(得分:4)
这就是我保持文件夹结构同时忽略其他所有内容的方式。您必须在每个目录(或 .gitkeep)中有一个 README.md 文件。
/data/*
!/data/README.md
!/data/input/
/data/input/*
!/data/input/README.md
!/data/output/
/data/output/*
!/data/output/README.md
答案 15 :(得分:4)
我知道我参加晚会很晚,但这是我的答案。
正如@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
谢谢。
答案 16 :(得分: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/
。
此外,语句的顺序似乎无关紧要。相反,您需要显式地否定所有子文件夹,然后才能否定其中的单个文件。
.gitignore的文件夹!public/typo3conf/
和文件夹内容public/typo3conf/*
是两件事。
很棒的线程!这个问题困扰了我一段时间;)
答案 17 :(得分:3)
简单的解决方案,如果您需要忽略除少数文件和少数 root 文件夹之外的所有内容:
/*
!.gitignore
!showMe.txt
!my_visible_dir
魔法在/*
(如上所述)它忽略了(根)文件夹中的所有内容但不是递归的。
答案 18 :(得分:3)
到目前为止,对我来说没有任何作用,因为我试图从lib中添加一个jar。
这没效果:
build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar
这有效:
build/*
!build/libs
答案 19 :(得分:2)
我已经开始工作
# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib
答案 20 :(得分: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/
,然后另一个条目扩展到其下的所有文件和文件夹{ {1}}
答案 21 :(得分:0)
这是我的方法:
/* JQM no frills */
.ui-btn,
.ui-btn:hover,
.ui-btn:focus,
.ui-btn:active,
.ui-btn:visited {
text-shadow: none !important;
}
/* Remove JQM blue halo */
.ui-btn:focus {
-moz-box-shadow: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
/* Speed-up some android & iOS devices */
* {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
使用<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My App</title>
<meta name="description" content="My App">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="user-scalable=no, initial-scale=1.0001, maximum-scale=1.0001, width=device-width, minimal-ui shrink-to-fit=no">
<meta http-equiv="cleartype" content="on">
<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
<script type="application/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
$(document).on("mobileinit", function() {
/* SEO - Remove h1 tag from loader */
$.mobile.loader.prototype.defaultHtml = "<div class='ui-loader'><span class='ui-icon-loading'></span><h6></h6></div>";
/* Add onbefore events to the JQM collapsible */
$.widget("mobile.collapsible", $.mobile.collapsible, {
_handleExpandCollapse: function(isCollapse) {
if(this._trigger("before" + (isCollapse ? "collapse" : "expand"))) {
this._superApply(arguments);
}
}
});
});
</script>
<script type="application/javascript" src="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"></script>
</head>
<body>
<div id="Gauntlet" data-role="page">
<div data-role="header" class="ui-flipswitch-active ui-overlay-shadow">
<h2>Home</h2>
</div>
<div data-role="content" role="main">
<div data-role="collapsible-set">
<div data-role="collapsible" data-collapsed="false" data-mini="true">
<h3>Gauntlet Traits:</h3>
<div class="ui-grid-b ui-responsive">
<div class="ui-block-a">
<select name="myList1" id="myList1" data-native-menu="false" data-mini="true">
<option value="1">The 1st Option</option>
<option value="2">The 2nd Option</option>
<option value="3">The 3rd Option</option>
<option value="4">The 4th Option</option>
</select>
</div>
<div class="ui-block-b">
<select name="myList2" id="myList2" data-native-menu="false" data-mini="true">
<option value="1">The 1st Option</option>
<option value="2">The 2nd Option</option>
<option value="3">The 3rd Option</option>
<option value="4">The 4th Option</option>
</select>
</div>
<div class="ui-block-c">
<select name="myList3" id="myList3" data-native-menu="false" data-mini="true">
<option value="1">The 1st Option</option>
<option value="2">The 2nd Option</option>
<option value="3">The 3rd Option</option>
<option value="4">The 4th Option</option>
</select>
</div>
</div>
<div class="ui-grid-solo">
<div class="ui-block-a">
<button type="button" id="submit" data-mini="true">Submit</button>
</div>
</div>
</div>
</div>
<div id="table_div"></div>
</div>
</div>
</body>
</html>
来递归地查看未跟踪目录中的单个文件-使用# 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
只会看到文件夹,这可能使您误以为它们中的所有内容都被跟踪了
答案 22 :(得分:0)
# Ignore everything
*
# But not these files...
!script.pl
!template.latex
可能包括:
!.gitignore
来自https://git-scm.com/docs/gitignore:
可选的前缀“
!
”使模式无效。先前模式排除的所有匹配文件将再次包含在内。如果排除该文件的父目录,则无法重新包含该文件。由于性能原因,Git不会列出被排除的目录,因此包含在文件上的任何模式无论在何处定义都无效。对于以文字“\
”开头的模式(例如“!
”),请在第一个“!
”前面加上反斜杠(“\!important!.txt
”)。...
排除特定目录
foo/bar
以外的所有内容的示例(请注意/*
-不带斜杠,通配符还将排除foo/bar
内的所有内容)$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
答案 23 :(得分:0)
我执行此操作的最简单方法是强制添加文件。即使将其埋入或嵌套在忽略git的子目录树中,也会在git中进行说明。
例如:
.64ignore中不包含x64文件夹:
x64/
但是您要包括位于myFile.py
目录中的文件x64/Release/
。
然后,您必须:
git add -f x64/Release/myFile.py
您可以对匹配模式的文件的多个文件执行此操作,例如
git add -f x64/Release/myFile*.py
以此类推。