忽略 Git 项目中的任何“bin”目录

1459

我有这样的目录结构:

.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文件。还有一些文件和目录的名称中包含子字符串“bin”,我希望保留它们

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


22
也许有人会发现这很有用:如果您有几个代码库,每个代码库都有相同的 .gitignore 文件,您可以将其放在“公共”位置,并运行> git config --global core.excludesfile ~/.gitignore_global。最后一个参数是指向公共位置的路径。附注:我是 Git 的新手,不确定这是否是“最佳实践”建议。因此,请告诉我是否不应该这样做。谢谢。 - Budda
** 语法现在(2013年3月,git 1.8.2)似乎已经正式记录在案:请参见我的回答 - VonC
3
如果有人想阅读最新版本的实际手册页面,请参阅 gitignore(5) 手册页 - user456814
如果您已经厌倦了为一行信息阅读文章,可以选择更友好的选项。请访问以下链接:https://www.atlassian.com/git/tutorials/saving-changes/gitignore#git-ignore-patterns - suazi
可能值得注意的是,在创建全局忽略文件时,将其命名为~/.cvsignore是有益的。其他版本控制系统也使用这个名称,使它更加“全局化”。 - evanthegrayt
16个回答

2128
在1.8.2版本之前,**.gitignore中没有任何特殊含义。从1.8.2版本开始,git支持使用**表示零个或多个子目录(参见发布说明)。 忽略当前目录树下所有名为bin的目录的方法是在.gitignore文件中添加以下模式:
bin/
在man页面中,有一个忽略名为foo的目录的示例,使用了类似的模式。 如果您的git索引中已经有任何不再希望跟踪的bin文件夹,则需要显式地将它们删除。Git不会因为现在匹配新的.gitignore模式而停止跟踪已经被跟踪的路径。执行一个仅从索引中删除(rm)文件夹,递归地(-r)。根目录bin文件夹的命令行示例:
git rm -r --cached bin

75
从git 1.8.2开始,git将接受在.gitignore文件中使用**(来源:1.8.2变更日志)。 - Carlos Campderrós
18
binbin/是相同的吗? - Nisba
39
@Nisba,它们是不同的,“bin”会忽略名为“bin”的文件,而“bin/”则用于命名为“bin”的目录。 - Rani Kheir
8
自从我遇到这个问题后,我学会了Git命令中的文件夹名称是区分大小写的:“bin != Bin” - 也许这个提示能为某些人节省几分钟的时间 :) - dba
1
在Windows10中,您无法创建.gitignore文件,您必须创建一个gitignore.txt文件,然后在命令提示符中运行ren gitignore.txt .gitignore来创建此文件。 - shabby
显示剩余5条评论

523

你梦想中的 .gitignore 文件似乎应该是:

bin/

在顶层。


1
将其放入gitignore_global文件中。 - μολὼν.λαβέ
2
@GAlexander,为什么有人想要全局忽略bin/目录?它们通常具有版本化的内容。而全局忽略不会影响存储库的其他用户。 - Michael Krelin - hacker

297

我认为对于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 吗? - ajax333221
它救了我的一天,谢谢! - vikash sinha

76

git 1.8.2(2013年3月8日) 版本开始,** 的功能就变得更加完善并受到显式支持。

.gitignore.gitattributes 文件中的模式可以使用 **/ 作为匹配零个或多个子目录级别的模式

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

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

/main/**/bin/

50
[Bb]in/

同时匹配大小写


2
[B]in/ 仅为大写 - Gank
如何让只有 Bin 文件夹被忽略,而让 bin 提交到 Git?[B]in/ 将同时提交 Binbin - Gank
6
这样应该可以了,@Gank: Bin/ !bin/ - Marco G

40

步骤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 Console(请参见下面的截屏),并运行以下命令。

git rm -r --cached .
git add .
git commit -m "Update .gitignore"

PM控制台 问题将会完全解决。


37

我在这里没有看到提到,但这似乎是区分大小写的。一旦我改变为/Bin,文件就会被忽略,与预期相同。


3
这不是对原问题的答案,原问题明确涉及“bin”,而非“Bin”。 - CB Bailey
57
虽然不是一个答案,但对于其他搜索同一问题的人来说,它确实增加了完整性(包括我自己,就在刚才)。 - Jay

27
< p >< code > [Bb]in < /code > 将解决问题,但是...这里有一个更详尽的列表,您应该忽略其中的内容(由GitExtension提供的示例列表):< /p >
#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
注意:像这样的东西应该在你的全局 gitignore 中(通常位于你的主目录下)。项目 gitignore 只应该忽略与你的项目特定相关的内容(例如,C 应用程序的 .o 文件)。 - BraveNewCurrency

19

5
这并没有真正回答问题,但正是我在寻找的东西。 - Dave

18

实际上,所有的答案都对我无效,唯一有效的是(在 Linux 上):

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

git version 2.18.0 

1
这是否也忽略了所有子目录中名为“bin”的文件夹? - vineeshvs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,