关于gitignore:忽略git项目中的任何“bin”目录

ignoring any 'bin' directory on a git project

我有这样的目录结构:

1
2
3
4
5
6
7
.git/
.gitignore
main/
  ...
tools/
  ...
...

在主目录和工具以及任何其他目录中,在任何级别上都可以有一个"bin"目录,我想忽略它(我也想忽略它下面的所有内容)。我在.gitignore中尝试过这些模式,但没有一个有效:

1
2
3
4
5
6
7
/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

有人能帮我吗?如果我这样做,第一种模式(我认为应该有效的模式)就可以正常工作:

1
/main/**/bin/**/*

但我不想为每个顶级目录都有一个条目,也不想每次添加新目录时都要修改.gitignore。

这是在使用最新msysgit的Windows上。

编辑:还有一件事,有些文件和目录的名称中有子字符串"bin",我不想忽略它们:)


在1.8.2版本之前,**.gitignore中没有任何特殊的含义。从1.8.2开始,Git支持**表示零个或多个子目录(参见发行说明)。

忽略目录树中低于当前级别的所有名为bin的目录的方法是使用具有以下模式的.gitignore文件:

1
bin/

man页中,有一个使用类似模式忽略名为foo的目录的示例。

编辑:如果您的git索引中已经有了不再希望跟踪的bin文件夹,那么您需要显式地删除它们。Git不会因为匹配新的.gitignore模式而停止跟踪已经被跟踪的路径。只从索引(--cached)递归地执行文件夹移除(rm)(-r)。根bin文件夹的命令行示例:

1
git rm -r --cached bin


你梦想中的江户第一〔0〕似乎是:

1
bin/

在顶层。


我认为对于Git初学者来说值得一提:

If you already have a file checked in, and you want to ignore it, Git
will not ignore the file if you add a rule later. In those cases, you
must untrack the file first, by running the following command in your
terminal:

git rm --cached

因此,如果您希望在编辑后添加忽略本地存储库(已经存在)中的某些目录,则可以在根目录下运行该目录。

1
2
git rm --cached -r .
git add .

它将基本上"刷新"您的本地回购和取消对被忽略文件的存储。

见:

http://git-scm.com/docs/git-rm,网址:

https://help.github.com/articles/ignoring-files/


**以前从未正确工作过,但自Git 1.8.2(2013年3月8日)以来,似乎明确提到并支持:

The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory.

E.g."foo/**/bar" matches"bar" in"foo" itself or in a subdirectory of"foo".

在您的情况下,这意味着现在可以支持此行:

1
/main/**/bin/


1
[Bb]in/

匹配大小写


我没看到这里提到,但这似乎是区分大小写的。一旦我改为/bin,文件就会如预期的那样被忽略。


[Bb]in将解决这个问题,但…下面是您应该忽略的更广泛的内容列表(GitExtension的示例列表):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/


如果您正在为任何Visual Studio(.net)解决方案寻找一个伟大的全局.gitignore文件,我建议您使用该文件:https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

Afaik是.NET项目中最全面的.gitignore


步骤1:将以下内容添加到文件.gitignore。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

第2步:确保生效

如果问题仍然存在,那是因为.gitignore中的设置只能忽略最初未跟踪的文件。如果版本控制系统中已包含某些文件,则修改.gitignore无效。要完全解决这个问题,您需要打开git bash或package manager控制台(请参见下面的屏幕截图),在repository根文件夹中运行以下命令。

1
2
3
$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

PM console这样问题就完全解决了。


作为通知;

如果您认为.gitignore不起作用(因此在其中添加了foo/*文件夹,但git status仍显示文件夹内容已修改或类似于此),则可以使用此命令;

git checkout -- foo/*


对于2.13.3及更高版本,只在.gitignore文件中写入bin应该忽略bin及其所有子目录和文件。

bin


从字面上看,所有的答案都不适合我;唯一适合我的答案是(在Linux上):

1
2
3
4
**/bin
(yes without the / in the end)

git version 2.18.0

如果.gitignore中的模式以斜线/结束,它将只找到与目录匹配的模式。

换句话说,bin/将匹配目录bin及其下面的路径,但不匹配常规文件或符号链接bin

如果模式不包含斜线,就像在bin中一样,git将其视为shell glob模式(贪婪)。所以最好是使用简单的/bin

对于这个特定的问题,bin不是最好的解决方案。


将**/bin/添加到.gitignore文件对我有好处(注意:bin文件夹没有添加到索引中)。