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

问题描述 投票:0回答:14

我想忽略存储库中的所有文件,除了

bin
子目录中出现的文件。我尝试将以下内容添加到我的
.gitignore

*
!bin/*

但是,这没有达到预期的效果:我在

bin/
内部创建了一个新文件,但是执行
git status
仍然显示
nothing to commit (working directory clean)

有什么建议吗?

git gitignore
14个回答
340
投票

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

/*
/*/
!/bin/

这样你就可以获得所有的 bin 目录,包括子目录及其文件。


146
投票

这里如何忽略某个目录中除了一个目录“MY_SUPER_DUPER_TEMPLATE_directory”之外的所有内容

结构:/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory

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

80
投票

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

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

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore

47
投票

您遇到的唯一问题是

bin
目录本身与
bin/*
模式不匹配,因此 git 甚至不会在
bin
目录中查找。

我想到了两种解决方案。

.gitignore

*
!/bin/
!bin/*

.gitignore

*
!/bin/

bin/.gitignore

!*

我更喜欢第二种解决方案,因为第一个解决方案不会停止忽略

bin
目录中的文件,这些文件位于不称为
bin
的子目录中。这对于您的情况可能重要,也可能无关紧要。


28
投票

来自官方git doc,其中一个示例说:

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

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

有关前导斜杠的解释:何时在 gitignore 中使用前导斜杠


17
投票

在最新的 GIT 版本中尝试以下操作。

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

12
投票

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

/*
!/public_html
!/.gitignore

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


11
投票

聚会迟到了,但没有一个答案对我来说“开箱即用”。这个的作用是:

* 
!bin
!bin/**
  • 第一行忽略一切
  • 第二行包含后面的“bin”目录本身
  • 最后一行包含“bin”目录的全部内容,无论它是如何嵌套的(注意双星号),

9
投票

.gitignore
对我有用:

*/
/*
!bin/

6
投票

尝试这个不起眼的 git bug。

!bin**/**

希望有帮助:)

支持文档 git bug 示例

PS:先试试再评论。


4
投票

我最近不得不这样做:

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

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


0
投票

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

  • 数据库(主文件夹)
    • conf(子文件夹)
    • 驱动程序(子文件夹)
    • jars(子文件夹)
    • sql(子文件夹)

并且从 database 文件夹中,我只想推送 sql 文件夹,因此我的

.gitignore
文件如下:

database/*
!database/sql/

第一行只是说忽略 database 文件夹的所有子文件夹,第二行的意思是因为您忽略 database 文件夹的所有子文件夹排除(不要忽略)sql子文件夹


0
投票

对我来说,事实证明我不应该忽略父文件夹,而是使用

/*

忽略其中的文件和文件夹
-- **/node_modules

++ **/node_modules/*

然后

++ !node_modules/@my-package/

0
投票

我正在开发一个 WordPress 插件,这是我的

.gitignore
仅跟踪插件文件

/*
!/.gitignore
!/wp-content/
/wp-content/*
!/wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/my-plugin/
© www.soinside.com 2019 - 2024. All rights reserved.