我有一个像这样的目录结构:
.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',我不希望忽略它们。)
答案 0 :(得分:1655)
在1.8.2版之前,**
在.gitignore
中没有任何特殊含义。从1.8.2开始,git支持**
表示零个或多个子目录(参见release notes)。
在目录树中忽略当前级别下任何位置名为bin的所有目录的方法是使用带有模式的.gitignore
文件:
bin/
在man
页面中,有一个使用类似模式忽略名为foo
的目录的示例。
修改强>
如果您的git索引中已有任何bin文件夹,您不再希望跟踪它们,则需要明确删除它们。 Git不会因为它们现在匹配新的.gitignore
模式而停止跟踪已经被跟踪的路径。仅从索引( - 缓存)递归执行文件夹删除( rm )( -r )。根bin文件夹的命令行示例:
git rm -r --cached bin
答案 1 :(得分:440)
你梦想的.gitignore
似乎是:
bin/
在顶层。
答案 2 :(得分:200)
我认为值得一提的是git初学者:
如果您已经签入了文件,并且想要忽略它, Git 如果稍后添加规则,则不会忽略该文件。在那些情况下,你 首先必须在你的文件中运行以下命令来解开文件 终端:
git rm --cached
因此,如果您希望在编辑.gitignore之后添加忽略本地存储库中的某些目录(已存在),您希望在根目录上运行此目录
git rm --cached -r .
git add .
它基本上会刷新'您的本地repo和unstage忽略的文件。
请参阅:
答案 3 :(得分:69)
**
以前从未正常工作,但自git 1.8.2 (March, 8th 2013)以来,似乎已明确提及并支持:
.gitignore
和.gitattributes
个文件中的模式可以**/
,作为匹配0个或更多级别的子目录的模式。E.g。 "
的子目录中foo/**/bar
"匹配"bar
" in"foo
"本身或在"foo
"。
在您的情况下,这意味着现在可能支持此行:
/main/**/bin/
答案 4 :(得分:45)
[Bb]in/
匹配大写和小写
答案 5 :(得分:31)
我在这里没有看到它,但这似乎是区分大小写的。一旦我改为/ Bin,文件就会被按预期忽略。
答案 6 :(得分:24)
[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*/
答案 7 :(得分:17)
如果您正在为任何Visual Studio(.NET)解决方案寻找一个出色的全局.gitignore
文件 - 我建议您使用此文件:https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
AFAIK它拥有最全面的.gitignore
.NET项目。
答案 8 :(得分:11)
第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 Bash 或程序包管理器控制台(请参阅下面的屏幕截图),以便在存储库根文件夹中运行以下命令。
$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'
答案 9 :(得分:5)
作为通知;
如果您认为.gitignore
在某种程度上不起作用(因此添加了foo/*
文件夹,但git status
仍显示修改后的文件夹内容或类似内容,那么你可以使用这个命令;
git checkout -- foo/*
答案 10 :(得分:3)
对于2.13.3及之后,在.gitignore文件中只写bin应该忽略bin及其所有子目录和文件
<强>仓强>
答案 11 :(得分:3)
从字面上看,没有一个答案对我真正有效。唯一对我有用的是(在Linux上):
**/bin
(yes without the / in the end)
git version 2.18.0
答案 12 :(得分:1)
如果.gitignore
中的模式以斜杠/
结尾,则只会找到与目录匹配的内容。
换句话说,bin/
将匹配目录bin
及其下的路径,但不会匹配常规文件或符号链接bin
。
如果模式不包含斜杠,如bin
中所述,Git会将其视为外壳Glob模式(贪婪)。因此最好是使用简单的/bin
。
bin
并不是解决此特定问题的最佳解决方案。
答案 13 :(得分:0)
将** / bin /添加到.gitignore文件对我来说很有用(注意:bin文件夹没有添加到索引中)。
答案 14 :(得分:0)
在我的情况下,gitignore文件的编码有问题,请检查它是否为UTF-8
答案 15 :(得分:0)
除了@CB Bailey 的回答:
我尝试从索引和跟踪中删除多个名为 et-cache
(来自 Wordpress divi 主题的缓存文件夹)的文件夹(在子文件夹中)。
我添加了
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 中的跟踪中删除。