1377

我有一个这样的目录结构:

.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”,我不希望这些被忽略:)

4

16 回答 16

2023

在 1.8.2 版本之前,**.gitignore. 从 1.8.2 开始,git 支持**表示零个或多个子目录(请参阅发行说明)。

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

bin/

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

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

git rm -r --cached bin
于 2009-09-24T09:35:38.760 回答
501

你的.gitignore梦想似乎是:

bin/

在顶层。

于 2009-09-24T09:16:02.667 回答
279

我认为对于 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/

于 2015-05-13T08:54:23.003 回答
75

**以前从未正常工作过,但自git 1.8.2 (March, 8th 2013)以来,它似乎被明确提及和支持:

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

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

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

/main/**/bin/
于 2013-04-23T09:20:05.813 回答
49
[Bb]in/

匹配大小写

于 2013-08-30T05:32:42.733 回答
37

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

于 2009-10-08T22:00:31.317 回答
31

第 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/

第二步:确保生效

如果问题仍然存在,那是因为.gitignore中的设置只能忽略最初未跟踪的文件。如果版本控制系统中已经包含了一些文件,那么修改.gitignore是无效的。要彻底解决此问题,您需要打开Git Bash包管理器控制台(见下面的屏幕截图)以在存储库根文件夹中运行以下命令。

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

PM控制台 那么问题就彻底解决了。

于 2018-06-03T06:46:44.113 回答
26

[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*/
于 2015-01-03T00:23:22.040 回答
19

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

AFAIK 它拥有最全面.gitignore的 .NET 项目。

于 2015-07-30T14:33:38.597 回答
13

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

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

git version 2.18.0 
于 2018-07-16T17:28:24.877 回答
6

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

于 2017-08-03T16:41:16.973 回答
5

作为通知;

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

git checkout -- foo/*

于 2015-02-17T09:33:27.240 回答
4

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

于 2017-05-14T12:58:39.930 回答
1

如果里面的模式.gitignore以斜杠结尾/,它只会找到与目录的匹配项。

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


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

bin不会是这个特定问题的最佳解决方案。

于 2019-01-29T19:34:20.383 回答
1

除了@CB Bailey 的回答:

我试图从索引和跟踪中删除多个名为et-cache(Wordpress 主题的缓存文件夹)的文件夹(在子文件夹中)。

我添加了

et-cache/

.gitignore文件。但

git rm -r --cached et-cache

导致错误:

致命:pathspec 'et-cache' 不匹配任何文件

所以解决方案是使用powershell:

Get-ChildItem et-cache -Recurse |% {git rm -r --cached $_.FullName}

这将搜索所有名为 et-cache 的子文件夹。然后使用每个文件夹路径(全名)将其从 git 中的跟踪中删除。

于 2021-01-14T11:09:25.777 回答
0

在我的情况下 gitignore 文件的编码有问题,检查它是否是 UTF-8

于 2020-01-25T20:18:26.610 回答