git忽略子文件夹


438

我的.Net解决方案中有很多项目。我想排除所有“ bin / Debug”和“ bin / Release”文件夹(及其内容),但仍包括“ bin”文件夹本身以及其中包含的任何dll。

带“ bin /”的.gitignore会忽略“ Debug”和“ Release”文件夹,但还会忽略“ bin”文件夹中包含的所有dll。

.gitignore文件中的“ bin / Debug”或“ bin / Release”不排除目录,除非我将忽略模式完全限定为“ Solution / Project / bin / Debug”-我不想这样做将需要为我的解决方案中的每个项目都包括完整的模式,并为添加的任何新项目添加它。

有什么建议么?


为什么要添加DLL?如果您引用的是第三方DLL,则可能需要添加一个通用文件夹,供您所有项目参考。
帕迪

6
帕迪(Paddy)的权利-如果这些是第三方DLL,则可能应将其组织在远离您的代码的位置。但是,对我来说,听起来您正在检入自己的构建产品,这通常不是您想要的方式。您可以使用git来跟踪信息,该信息完全包含在代码和构建配置中。产品就是产品。跟踪它们会带来麻烦-例如,如果您更改了代码却忘记了构建和签入新产品该怎么办?
卡斯卡贝尔

我在排除子文件夹时遇到问题。尝试了所有内容,包括此处编写的确切示例,但没有成功。最终,我在文件夹模式之间添加了一个空白行,并且可以正常工作。也许是编码问题。我有Windows,并以UTF8编码。
RoadBump 2012年

Answers:


552

您是否尝试过通配符?

Solution/*/bin/Debug
Solution/*/bin/Release

在git 1.8.2版中,您还可以使用**通配符来匹配任何级别的子目录:

**/bin/Debug/
**/bin/Release/

8
它可以工作,除非在解决方案/模块/项目中有另一个项目的子文件夹,所以现在我添加了/ * / * / bin / Debug和/ * / * / * / bin / Debug(对于子文件夹文件夹)。看起来您必须为目录结构中的每个级别添加一个通配符子文件夹。
Marcel

1
@Marcel:好吧,git当然不会忽略您不告诉它的任何文件-它会忽略与通配符匹配的任何内容,仅此而已。
卡斯卡贝尔

我认为双星将跨越目录边界,即:/ ** / bin / Debug
Trent,

11
@Taras:不幸的是,事实并非如此。
Tuukka Mustonen 2012年

2
在Visual Studio上有一个与相关的错误**。现在应该修复。 链接
Bogac 2015年

106

您可以在顶层使用.gitignore忽略项目中具有相同名称的所有目录。例如:

Debug/
Release/

这应该立即更新,以便在执行git status时可见。确保这些目录尚未添加到git中,因为这将覆盖忽略项。


通过将模式添加到OPs $GIT_DIR/.git/info/exclude文件中,可以完成相同的操作。
Tim Henigan

1
区别在于.gitignore文件将遵循该代码,因此它适用于所有地方。排除文件仅在您的存储库本地,这意味着它仅适用于该特定存储库。除非其他提交者有理由提交这些目录,否则我建议使用.gitignore。
安德烈亚斯(Andreas)2010年

1
与此相关的另一个问题是,如果您的解决方案中有一个名为Debug的项目,那么该项目也会被忽略。我认为该解决方案是所有答案和注释的组合-重组解决方案以将常见或引用的dll保留在不同的文件夹中,然后忽略“ bin /”和/或使用通配符。
Marcel

16
+1对于确保目录尚未添加到git的评论。如果已经添加到git中,请执行以下操作:git rm -rf DirectoryName/
levibostian 2013年

57

问题不是要忽略所有子目录,而是在任何地方都找不到答案,因此我将其发布:*/*


1
您有机会澄清吗?我已经尝试过各种变化,并且无法git add忽略目录以及该目录所有子目录中的所有文件。我已经试过dirname/dirname/*dirname/**dirname/*/*,甚至绝望dirname/*/*/*dirname/*/*/*/*dirname/*/*/*/*/*
克里斯

3
*/*忽略所有子目录,但不忽略当前目录中的文件。忽略特定的子目录是正常的gitignore用法。dirnamedirname/dirname/*我所有的工作。该目录中的任何内容已经提交吗?
2014年

这是一个全新的回购-我删除整个.git尝试之间的目录,然后git initgit add --all .(也尝试没有--all),使用1.9.4.msysgit.1。我命名目录下的每个非空子目录都添加到索引中(在TortoiseGit和中选中git status)。.gitignore开始时没有相关内容,!但必须有一些冲突。现在解决了,方法是在期间删除文件夹add。猜猜这是需要更多挖掘才能提供必要信息以进行诊断的东西。感谢您向我保证我不会误解语法。
克里斯

如果我需要忽略文件夹中的文件夹而不是第一个文件夹怎么办?就像在forum / ignorethisfolder /中一样,但是他不应该忽略名为forum的文件夹
Jean Carlos Racoski

这对于我忽略名称以点开头的目录不起作用。“ /。 ”和“。* / *”也不起作用。
Tony

44

以上所有答案都是有效的,但我认为没有提到的事情是,一旦您将该目录中的文件添加到仓库中,就无法忽略包含该文件的目录/子目录(git将忽略该指令)。

要忽略已添加的文件,请运行

$ git rm --cached

否则,您必须首先从存储库的目标目录中删除所有文件-然后可以忽略该文件夹。


12
git rm --cached,如果您希望它们不受跟踪/与历史记录无关,但希望在本地保持文件完整。
埃里克·雷彭

29

除了将正确的条目放入.gitignore文件中之外,如果您想忽略已添加到存储库中的内容,还必须git rm -r /path/to/dir在将目录添加到.gitignore文件之前执行并提交。否则git唯一会忽略的就是您的ignore指令。


19

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

# 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:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

请注意,您必须如何明确允许要包含的每个级别的内容。因此,如果我在主题下有5个子目录,则仍然需要清楚地说明。

这是来自@Yarin在这里的评论:https : //stackoverflow.com/a/5250314/1696153

这些是有用的主题:

我也试过

*
*/*
**/**

**/wp-content/themes/**

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

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


13

要排除内容和子目录:

**/bin/*

要仅排除所有子目录但保留内容,请添加“ /”:

**/bin/*/

9

要忽略所有子目录,您可以简单地使用:

**/

从git 1.8.2版本开始可以使用。


8

在继续跟踪/bin目录中的文件时,忽略所有子文件夹的通用方法是将以下行添加到项目的.gitignore文件中:

bin/*/*

如果只想忽略特定的命名子文件夹,则可以执行以下操作:

bin/Debug/*
bin/Release/*

nb。如果bin目录不在您项目的根目录中(与.gitignore文件一起),则代替例如。bin/*/*您可能需要path/to/bin/*/*

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.