ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

可能有人会觉得有帮助:如果您的存储库很少,并且每个存储库都有相同的 .gitignore 文件,则可以将其放入“通用”位置并启动 > git config --global core.excludesfile ~/.gitignore_global 最后一个参数是路径到共同的位置。 PS 我是 git 新手,不确定这是否是“最佳实践”建议。因此,如果您不想这样做,请告诉我。谢谢你。
** 语法似乎现在(2013 年 3 月,git 1.8.2)正式记录:见 my answer below
如果有人想阅读实际手册页的最新版本,请参阅 gitignore(5) Manual Page
如果您厌倦了阅读文章以获取一行信息,则可以选择更友好的选择atlassian.com/git/tutorials/saving-changes/…
可能值得注意的是,在创建全局忽略文件时,将其命名为 ~/.cvsignore 是有益的。其他版本控制系统使用这个名称,使其更加“全球化”。

a
altocumulus

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

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

bin/

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

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

git rm -r --cached bin

从 git 1.8.2 开始,git 将接受 .gitignore 文件中的 **(来源:1.8.2 changelog
binbin/ 相同吗?
@Nisba,它们是不同的,bin 将忽略名为 bin 的文件,而 bin/ 用于名为 bin 的目录
因为我遇到了这个问题:git-command 中的文件夹名称是区分大小写的:) “bin!=Bin”——也许我可以通过这个提示为某人节省几分钟:)
windows10不能创建.gitignore文件,必须先创建一个gitignore.txt,然后在命令提示符下运行ren gitignore.txt .gitignore来创建这个文件
B
Bombe

您梦想的 .gitignore 似乎是:

bin/

在顶层。


把它放在 gitignore_global
@GAlexander,为什么要全局忽略 bin/ 目录?他们通常有版本化的内容。并且全局忽略不会影响存储库的其他用户。
p
plancys

我认为对于 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 替换点吗?
C
Community

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

.gitignore 和 .gitattributes 文件中的模式可以有 **/,作为匹配 0 级或更多级别子目录的模式。例如,“foo/**/bar”匹配“foo”本身或“foo”子目录中的“bar”。

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

/main/**/bin/

w
wisbucky
[Bb]in/

匹配大小写


[B]in/ 是唯一的大写
如何只让 Bin 文件夹忽略并让 bin 提交到 git? [B]in/ 将同时提交 Binbin
这应该可以做到,@Gank:Bin/ !bin/
C
Cory

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


这不是对明确关于 bin 而不是 Bin 的原始问题的答案。
虽然不是答案,但它确实增加了其他人在同一问题上搜索的完整性(我自己,刚刚)。
S
Shadi Alnamrouti

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

# 用户特定文件 *.suo *.user *.userosscache *.sln.docstates # 构建结果 [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ bld/ [Bb ]in/ [Oo]bj/ # Visual Studio 2015 缓存/选项目录 .vs/

第二步:确保生效

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

git rm -r --cached 。混帐添加。 git commit -m "更新 .gitignore"

https://i.stack.imgur.com/RO5DV.png


J
Jaider

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

注意:像这样的东西应该在你的 GLOBAL gitignore 中(通常在你的主目录中。)项目 gitignore 应该只忽略特定于你的项目的东西(即 C 应用程序的 .o 文件。)
J
Jochen van Wylick

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

AFAIK 它为 .NET 项目提供最全面的 .gitignore


这并不能真正回答问题,但这正是我想要的。
A
AnthonyC

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

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

git version 2.18.0 

这是否也忽略了子目录中名为 bin 的所有文件夹?
N
Nikhil Karanjkar

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

垃圾桶


K
K-Gun

作为通知;

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

git checkout -- foo/*


D
Dhwaneel

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


N
Norman

除了@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 中的跟踪中删除。


p
prosti

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

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

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

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


您的意思是“以”/ 开头吗?
J
Jacek Plesnar

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