2010-03-30 308 views
249

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

。“bin /”.gitignore忽略“Debug”和“Release”文件夹,但也包含“bin”文件夹中包含的任何dll。

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

有什么建议吗?

+0

为什么要添加DLL的?如果您引用的是第三方DLL,那么添加一个所有项目随后引用的通用文件夹可能是有意义的。 – Paddy 2010-03-30 13:39:38

+4

Paddy的权利 - 如果这些是第三方DLL,他们可能应该远离您的代码。不过,对我来说,这听起来像是在检查自己的构建产品,这通常不是您想要的方式。你使用git来跟踪代码和构建配置中完全包含的*信息*。产品就是产品。跟踪他们正在寻找麻烦 - 例如,如果您更改代码但忘记了构建和检查新产品会怎么样? – Cascabel 2010-03-30 15:02:36

+0

我在排除子文件夹时遇到了问题。试了一下,包括这里写的确切样本,但没有成功。最后,我在文件夹模式之间添加了一个额外的空白行,并且它正在工作。也许是一个编码问题。我有窗口,并以UTF8编码。 – RoadBump 2012-10-10 03:29:38

回答

321

你试过通配符吗?

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

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

**/bin/Debug/ 
**/bin/Release/ 
+7

它的工作原理,除非在例如另一个项目中有一个子文件夹。解决方案/模块/项目,所以现在我已经添加了/ */*/bin/Debug和/ */*/*/bin/Debug(用于子文件夹)。看起来您必须为目录结构中的每个级别添加通配符子文件夹。 – Marcel 2010-03-30 14:08:49

+0

@Marcel:那么,git肯定不会忽略任何你不告诉它的文件 - 它会忽略与通配符匹配的任何文件,不会更多,也不会少。 – Cascabel 2010-03-30 14:59:16

+0

我认为双星会跨越目录界限,即:/ **/bin/Debug – Taras 2011-12-29 23:07:37

84

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

Debug/ 
Release/ 

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

+0

将模式添加到OP $'GIT_DIR/.git/info/exclude'文件中也可以做到这一点。 – 2010-03-30 20:14:22

+1

区别在于.gitignore文件将遵循代码,因此适用于任何地方。而排除文件仅对您的存储库是本地的,这意味着它仅适用于特定存储库。除非其他提交者有理由要提交这些目录,否则我会推荐使用.gitignore。 – Andreas 2010-03-31 05:27:07

+1

此问题的另一个问题是,如果您的解决方案中有一个名为Debug的项目,那么该项目也将被忽略。我认为解决方案是所有答案和评论的组合 - 重新构建解决方案以将常见或引用的dll保存在不同的文件夹中,然后忽略“bin /”和/或使用通配符。 – Marcel 2010-04-01 10:08:24

38

问题不在于忽略所有子目录,而是我无法在任何地方找到答案,所以我会发布它:*/*

+1

您有任何可以澄清的机会吗?我已经尝试了各种各样的变体,并且无法通过'git add'来忽略该目录的所有子目录中的目录和所有文件。 dirname/*,* dirname/*,* dirname/*,dirname/**','dirname/*/*'/*','dirname/*/*/*/*/*'。 – Chris 2014-11-20 17:13:36

+2

'*/*'忽略当前目录中的所有子目录,但不包含文件。忽略特定的子目录是正常的gitignore用法。 'dirname','dirname /'和'dirname/*'都适用于我。该目录中的任何内容是否已经提交? – mgold 2014-11-21 03:18:20

+0

这是一个全新的回购 - 我尝试删除整个'.git'目录,然后'git init',然后'git add --all .'(也尝试不用'--all'),使用1.9.4 .msysgit.1。我的命名目录下的每个非空子目录都被添加到索引(在TortoiseGit和'git status'中检查)。 '.gitignore'中没有相关的行开始'!'但必须有一些冲突。现在通过在“add”期间删除文件夹解决。猜猜这是需要多一点挖掘才能提供必要的信息来诊断的东西。谢谢你让我放心,我不会误解语法。 – Chris 2014-11-21 14:51:06

21

以上所有答案都是有效的,但我不认为提到的是,一旦您将该目录中的文件添加到回购站中,就不能忽略包含该文件的目录/子目录(git将忽略该指令)。您必须首先从回购目录中删除目标目录中的所有文件,然后您可以忽略该文件夹。

+5

git rm --cached如果你想让它们跟踪/不相关的历史,但要保持文件在本地完好。 – 2015-05-30 21:04:00

+0

谢谢你的回答 - 它帮了我很多!它说明了git糟糕的另一个原因。 – user949300 2018-03-06 18:29:40

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

注意如何有明确允许您要包括各层次的内容。因此,如果我在主题下有深层次的子目录5,我仍然需要说明这一点。

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

这些都是有用的主题:

我也试过

* 
*/* 
**/** 
那10

**/wp-content/themes/**

/wp-content/themes/**/*

没有工作对我来说,无论是。很多线索和错误!

+3

感谢分享。这是我需要让我们的团队离开git的例子。 – raindog308 2017-12-15 18:07:58

2

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

bin/*/* 

如果你想忽略只能使用特定的子文件夹:

bin/Debug/* 
bin/Release/* 

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

14

除了把正确的条目在你的.gitignore文件,如果你想忽略已经加入到回购的东西,你必须做git rm -r /path/to/dir和承诺,你添加目录到你的面前。 gitignore文件。否则,git将忽略的仅仅是您的忽略指令。

2

不理你可以简单地使用所有子目录:

**/ 

这个工作过程中的git的1.8.2版本。