如何让Git忽略除子目录之外的所有内容?

如何让Git忽略除子目录之外的所有内容?,git,gitignore,Git,Gitignore,我想忽略存储库中的所有文件,除了出现在bin子目录中的文件。我尝试将以下内容添加到我的.gitignore: * !bin/* 但是,这并没有达到预期效果:我在bin/中创建了一个新文件,但是执行git status仍然显示无需提交(工作目录清理) 有什么建议吗?您唯一的问题是bin目录本身与bin/*模式不匹配,因此git甚至不在bin目录中查找 有两种解决方案浮现在脑海中 .gitignore: * !/bin/ !bin/* * !/bin/ !* 或 .gitignore: *

我想忽略存储库中的所有文件,除了出现在
bin
子目录中的文件。我尝试将以下内容添加到我的
.gitignore

*
!bin/*
但是,这并没有达到预期效果:我在
bin/
中创建了一个新文件,但是执行
git status
仍然显示
无需提交(工作目录清理)


有什么建议吗?

您唯一的问题是
bin
目录本身与
bin/*
模式不匹配,因此git甚至不在
bin
目录中查找

有两种解决方案浮现在脑海中

.gitignore

*
!/bin/
!bin/*
*
!/bin/
!*

.gitignore

*
!/bin/
!bin/*
*
!/bin/
!*
bin/.gitignore

*
!/bin/
!bin/*
*
!/bin/
!*

我更喜欢第二种解决方案,因为第一种解决方案不会停止忽略
bin
目录中的文件,这些文件位于不称为
bin
的子目录中。在您的情况下,这可能很重要,也可能不重要。

我认为更好的方法是通过以斜杠开始模式,将每个模式锚定到顶部git目录:

/*
!/public_html
!/.gitignore

与其忽略所有文件,它只会忽略顶级文件,而不是您不想忽略的目录中的文件。

.gitignore
适用于我:

*/
/*
!bin/

这将忽略根文件和根目录,然后取消忽略根bin目录:

/*
/*/
!/bin/

通过这种方式,您可以获得所有bin目录,包括子目录及其文件。

这里介绍了如何忽略除某个目录中的一个目录“MY_SUPER\u DUPER\u TEMPLATE\u目录”之外的所有内容

结构:/bitrix/templates/我的超级复制器模板目录

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore

您必须排除前往目的地途中的所有内容,但必须包括目的地:

注意:这是一个排除文件(即gitignore),因此逻辑颠倒。忽略所有,tsp目录除外,忽略tsp目录中的所有,src目录除外


在最新的GIT版本中尝试以下内容

*
!*/
!/path/to/your/dir/**

试试这个晦涩难懂的git bug

!bin**/**
希望有帮助:)

支持文件

PS:在评论之前先尝试一下。

从官方那里,一个例子说:

排除除特定目录foo/bar之外的所有内容的示例(注意/*-不带斜杠,通配符也会排除foo/bar中的所有内容):


关于前导斜杠的解释:。

我最近不得不这样做:

*
!sub-dir/
!sub-dir/*

我不知道为什么我需要两行来排除一个文件夹,但这对我和macos来说都是有效的。

这是我的解决方案。在我的场景中,我有一个包含子文件夹的文件夹,如下所示:

database/*
!database/sql/
  • 数据库(主文件夹)
    • conf(子文件夹)
    • 驱动程序(子文件夹)
    • jars(子文件夹)
    • sql(子文件夹)
数据库文件夹中,我只想推送sql文件夹,这样我的
.gitignore
文件如下所示:

database/*
!database/sql/

其中第一行简单地说忽略数据库文件夹的所有子文件夹,第二行的意思是,由于您忽略了数据库文件夹的所有子文件夹,因此排除(不要忽略)sql子文件夹对我不起作用。我必须有一个像这样的.gitignore来让它工作:
#忽略一切*#但不要忽略这些文件/wp内容//wp内容/插件//wp content/plugins/my_plugin//wp content/plugins/my_plugin/*
注释中是否没有块代码?有更好的单文件解决方案+1,原则是包括一个目录,然后排除它的内容,然后包括所需的子目录,等等。我最终在我的项目中使用了这个答案。出于某种原因,这对我来说并不一致。我有两行
/stuff/
/stuff/specific/
,但它仍然忽略/stuff/specific/@LB——我有一个类似的问题,
git-check-ignore-v
告诉我这是因为
~/.gitignore
是/*/必需的吗?这对我不起作用。我不得不添加
/bin/
到我的根
.gitignore
文件中,但是另外我必须添加一个
/bin/.gitignore
文件和
*。。。只做其中一个改变是行不通的。它只有在合并了这两个更改后才起作用。@LB和其他更改后,请尝试
/stuff/*
/填充/特定/
。区别在于
/stuff/
告诉它忽略stuff目录本身,
/stuff/*
说忽略stuff目录中的所有目录,然后不要忽略这个特定目录。这对我来说很重要,事实上应该如此/path/to/your/dir/**为最后一个line@faham,是的,刚刚添加了它。还可以看到,这对于取消我修改过的laravel供应商软件包非常有用!谢谢你,你帮我省去了很多头痛。这应该被选为最佳答案。万分感谢你,这对我很有用!请注意,这里的行的顺序很重要,您不能有/例如,foo/bar在/foo/*之前。