忽略git项目上的任何'bin'目录


1236

我有这样的目录结构:

.git/
.gitignore
main/
  ...
tools/
  ...
...

在main和tools以及任何其他目录中的任何级别上,都可以有一个“ bin”目录,我想忽略该目录(我也想忽略其下的所有内容)。我已经在.gitignore中尝试了每种模式,但是它们都不起作用:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

谁能帮我吗?如果这样做,第一个模式(我认为应该起作用的模式)就可以正常工作:

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

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

在Windows上使用最新的msysgit。

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


14
可能有人会有所帮助:如果您的存储库很少,并且每个存储库具有相同的.gitignore文件,则可以将其放入“公共”位置并启动> git config --global core.excludesfile〜/ .gitignore_global最后一个参数是path到共同的位置。PS我是git的新手,不确定是否是“最佳实践”建议。因此,如果您不想这样做,请告诉我。谢谢。
布达

**语法现在看来(2013年3月,Git的1.8.2)正式记载:看到我的回答如下
VonC

2
如果有人想阅读实际手册页面的最新版本,请参见gitignore(5)手册页面

如果你厌倦了阅读文章的信息的一行的价值友好选项atlassian.com/git/tutorials/saving-changes/...
suazithustra

Answers:


1833

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

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

bin/

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

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

git rm -r --cached bin

72
使用Git 1.8.2开始,git会接受**.gitignore文件(来源:1.8.2更新日志
卡洛斯Campderrós

15
bin一样的bin/吗?
Nisba '16

29
@Nisba不同,它们bin将忽略名为bin的文件,而bin/对于名为bin的目录
Rani Kheir

8
因为我摔倒了:git-command中的文件夹名称区分大小写:)“ bin!= Bin”-也许我通过这个提示节​​省了几分钟时间:)
dba

1
在windows10您不能创建的.gitignore文件,你必须创建一个gitignore.txt然后仁gitignore.txt的.gitignore在命令提示符下创建该文件运行
破旧的


234

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

如果您已经签入了文件,并且想要忽略它,那么以后再添加规则时,Git将不会忽略该文件。在这种情况下,必须首先通过在终端中运行以下命令来取消跟踪文件:

git rm --cached

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

git rm --cached -r .
git add .

基本上,它将“刷新”您的本地存储库并取消暂存被忽略的文件。

看到:

http://git-scm.com/docs/git-rm

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


如果我通常git add -A对提交执行a 操作,可以使用它吗?我也可以在第一行用-A代替点吗?
ajax333221

69

**不曾正确地工作过,但是自git 1.8.2(2013年3月8日)以来,似乎已明确提及并支持它:

.gitignore.gitattributes文件中的模式可以具有**/与0或更高级别的子目录匹配的模式

例如,“ foo/**/bar”匹配“ barfoo本身或“ foo” 子目录中的“ ”。

就您而言,这意味着现在可以支持此行:

/main/**/bin/


34

我没有看到这里提到的内容,但这似乎区分大小写。一旦更改为/ Bin,文件将按预期被忽略。


3
这不是对原始问题的答案bin,而不是Bin
CB Bailey 2009年

49
尽管不是答案,但确实为其他在同一问题上进行搜索的人(我自己,刚才)增加了完整性。
杰伊,2010年

25

[Bb]in 可以解决问题,但是...这里是您应该忽略的更广泛的事情列表(GitExtension的示例列表):

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

3
注意:像这样的东西应该在您的GLOBAL gitignore中(通常在您的主目录中。)项目gitignore应该只忽略特定于您项目的内容(即C应用程序的.o文件。)
BraveNewCurrency


18

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

# 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 BashPackage Manager控制台(请参见下面的屏幕截图)以在存储库根文件夹中运行以下命令。

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

PM控制台 然后,该问题将得到彻底解决。


8

从字面上看,没有一个答案对我真正有用。唯一对我有用的是(在Linux上):

**/bin
(yes without the / in the end)

git version 2.18.0 

这是否也忽略了子目录中命名的所有文件夹bin
vineeshvs

5

通知;

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

git checkout -- foo/*



2

在.gitignore文件中添加** / bin /对我来说是成功的窍门(注意:bin文件夹未添加到索引中)。


1

如果里面有图案 .gitignore以斜线结尾/,则只会找到与目录匹配的内容。

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


如果模式不包含斜线(例如binGit中的斜线),则将其视为外壳glob模式(贪婪)。所以最好是使用simple /bin

bin 并不是针对此特定问题的最佳解决方案。


您是说“开始于” /吗?
vineeshvs

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.