使用.gitignore忽略除特定目录以外的所有内容


140

我的问题是我的git repo中有一堆WordPress网站,我只想选择性地提交themes文件夹中的内容,而忽略WordPress中的其余冗余文件。

我曾经使用过.gitignore文件来忽略文件类型,但是可以以其他方式使用它-忽略所有内容,但忽略某个文件夹路径吗?

根(git repo)
-/ wordpress
--/(WordPress网站1)/ wp-content / themes
--/(WordPress网站2)/ wp-content / themes
--/(WordPress网站3)/ wp-content / themes

谢谢-

更新:

根据答案,我做了以下操作,但是不起作用。有任何想法吗?

# Ignore everything:
*
# Except for wordpress themes:
!*/wp-content/themes/*

我还尝试了以下变体:

!*/wp-content/themes*
!*wp-content/themes/*
!wp-content/themes/*
!/wordpress/*/wp-content/themes*
!wordpress/*/wp-content/themes*

这些都不读我的themes文件夹。

Answers:


133

这是我的操作方式-本质上,您必须走上一条路,在任何方向上通配符不得超过一个级别:

# Ignore everything:
*

# Except for the themes directories:

!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

请注意,您必须如何明确允许要包含的每个级别的内容。因此,如果我在主题下有5个子目录,则仍然需要清楚地说明。

这只是对我有用的方式。如果有人愿意提供更多更详尽的解释。

此外,这些答案也很有帮助:
如何在gitignore中否定模式的工作方式
如何在gitignore中排除规则实际上的工作方式


注:我尝试使用双通配符“水珠”,但根据该功能是依赖于系统的,它并没有在我的Mac工作:

不工作:

!**/wp-content/themes/
!**/wp-content/themes/**

4
在git 1.8.4之前,**如果您的模式中没有斜杠,则通配符仅起作用,请参见sparethought.wordpress.com/2011/07/19/…– 2013

这应该正常工作:!/wordpress/*/wp-content/themes/**/*
that0n3guy 2014年

1
这种语法在Windows上可以使用吗?它似乎对我
不起作用

它在Windows 10上运行奇妙。将其用于Visual Studio Code中的各种自定义项目。
klewis19年

我将这个答案与@吴毅凡提供的答案结合使用,为我工作。
MikeyE

95

我尝试了上述方法,但效果不佳。更好的方法如下:https : //gist.github.com/444295

# This is a template .gitignore file for git-managed WordPress projects.
#
# Fact: you don't want WordPress core files, or your server-specific
# configuration files etc., in your project's repository. You just don't.
#
# Solution: stick this file up your repository root (which it assumes is
# also the WordPress root directory) and add exceptions for any plugins,
# themes, and other directories that should be under version control.
#
# See the comments below for more info on how to add exceptions for your
# content. Or see git's documentation for more info on .gitignore files:
# http://kernel.org/pub/software/scm/git/docs/gitignore.html

# Ignore everything in the root except the "wp-content" directory.
/*
!.gitignore
!wp-content/

# Ignore everything in the "wp-content" directory, except the "plugins"
# and "themes" directories.
wp-content/*
!wp-content/plugins/
!wp-content/themes/

# Ignore everything in the "plugins" directory, except the plugins you
# specify (see the commented-out examples for hints on how to do this.)
wp-content/plugins/*
# !wp-content/plugins/my-single-file-plugin.php
# !wp-content/plugins/my-directory-plugin/

# Ignore everything in the "themes" directory, except the themes you
# specify (see the commented-out example for a hint on how to do this.)
wp-content/themes/*
# !wp-content/themes/my-theme/

1
@ dwenaus-感谢分享了植根于特定的wordpress目录回购有用这个-长相,但都会对回购W多重WordPress网站它的下面,这就是我要去的..不工作
Yarin

这种结构/模型非常有帮助。我想要一个单独的回购用于合并的Magento / WP安装,并且使用此技术使用少于30行的.gitignore,我能够将其缩小到仅Magento主题/外观文件和WP主题文件。谢谢!
random_user_name13年

只是不要将此设置与自动部署一起使用,因为新手git用户可能会将缩进区域之外的文件弄乱(即,如果他们偶然删除了存储库中的所有文件,并且该文件被自动部署,则将很杂乱)。除此之外,它运作良好。
dwenaus

你是男人!特别是如果您的版本> = 2.1.4。参考:git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

修改第一行

*

更改为

/*

2
这项工作对我来说。我的.gitignore文件是这样的/ *!.
gitignore

12

尝试以下答案:

使.gitignore忽略除少数文件以外的所有内容

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

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

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

/*
/*/
!/bin/

这样,您将获得所有bin目录,包括子目录及其文件。


@ irritate-谢谢,没有看到这些-但是,我在将它们应用于我的情况时遇到了麻烦。请参阅上方的编辑...
Yarin

1
我发布的第二个链接说,您将同时需要!*/wp-content/themes/!*/wp-content/themes/*。您尝试过这种变化吗?另外,您也可以选择使用!*/wp-content/themes/并且在每个主题目录中都有自己的.gitignore文件,使用!*
烦恼

1
@ irritate-那种变化也不起作用,无论如何,我看不出与!*/wp-content/themes*
Yarin

9

如果在模式前加上感叹号(!),则它会否定之前排除它的任何模式。因此,大概可以忽略所有内容,然后通过使用此模式仅允许您想要的内容。


@ dappawit-谢谢-概念很有意义,我知道它适用于文件,但不适用于主题文件夹-请参见上方的编辑...
Yarin

我不是glob模式的专家,但阅读的.gitignore手册页,我相信这可能工作:!wordpress/[write out directories]/wp-content/themes/。请注意,斜杠没有斜线星号。还要注意,*它将仅匹配一个级别,而不匹配多个目录。这是手册页:kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit 2011年

帮助我意识到我必须将否定规则放在其他规则之后,谢谢
Ax12'2

6

我需要忽略所有内容,但不要忽略一个包含子目录的文件夹。

对我来说,这有效

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt

5

假设您具有这样的目录结构:

– sites
– -all
– – – -files
– – – – – -private
– – – – – – – -newspilot
– -default
– – – -files
– – – – – -private
– – – – – – – -newspilot

如果只想允许site / all / files / private / newspilotsites / default / files / private / newspilot,则可以首先尝试执行以下操作:

sites/*/files/*
!sites/*/files/private/newspilot

错了!gitignore的棘手之处在于,您必须首先允许包含父目录(“私有”),然后才能将其子目录(“ newspilot”)包含在提交中。

sites/*/files/*
!sites/*/files/private
sites/*/files/private/*
!sites/*/files/private/newspilot

http://www.christianengvall.se/gitignore-exclude-folder-but-include-a-subfolder/


“首先必须包含父目录,然后才能允许其子目录”-感谢您指出这一点!正是我的问题。
喷射蓝

4

Yarin的答案对我有用,这是我的版本(我不需要/wordpress子目录):

*

!.gitignore
!/wp-content/
!/wp-content/themes/
!/wp-content/themes/*
!/wp-content/themes/*/*
!/wp-content/themes/*/*/*
!/wp-content/themes/*/*/*/*
!/wp-content/themes/*/*/*/*/*

# I don't want to track this one, so it's included here, after the negated patterns. 
wp-content/themes/index.php

4

即使无数次回到这个问题,我也总是被卡在某个地方。我已经提出了逐步执行此操作的详细过程:

首先只使用git add添加实际内容。

它将显示添加到索引的相关文件,而其他所有文件仍未跟踪。这有助于.gitignore逐步构建。

$ git add wp-content/themes/my-theme/*
$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-includes/
        ...

DUMMY.TXT在目录中添加一个临时文件:

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-content/themes/my-theme/DUMMY.TXT  <<<
        ...
        wp-includes/
        ...

现在,我们的目标是构建规则,DUMMY.TXT以使它成为我们完成后仍然显示为“未跟踪”的唯一规则。

开始添加规则:

.gitignore

/*

第一个只是忽略一切。未跟踪的文件应全部消失,仅应显示索引文件:

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

在路径中添加第一个目录 wp-content

/*
!/wp-content

现在,未跟踪的文件将再次显示,但仅包含wp-content的内容

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

忽略第一个目录中的所有内容/wp-content/*并忽略!/wp-content/themes

/*
!/wp-content

/wp-content/*
!/wp-content/themes

现在,未跟踪的文件将进一步缩小到仅 wp-content/themes

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

重复此过程,直到该哑文件是唯一仍显示为“未跟踪”的文件:

/*
!/wp-content

/wp-content/*
!/wp-content/themes

/wp-content/themes/*
!/wp-content/themes/my-theme

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/my-theme/DUMMY.TXT

3

对于那些寻求更清洁解决方案的人,请尝试以下方法。

答案的注释中所述,您必须递归使用此方法。

在此示例中,您有一个文件夹和文件./所在的网站设置,而在中有一个WordPress安装设置。要正确忽略目录中主题目录本身()之外的所有内容,您将必须递归地忽略并允许每个目录直到您希望允许的目录:.git.gitignore./wordpress./wordpresswordpress/wp-content/themes/my-theme

wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*
!wordpress/wp-content
!wordpress/wp-content/themes
!wordpress/wp-content/themes/my-theme

忽略通配符并允许(或忽略“除”之外)目录本身的原因使Git可以先忽略目录中的内容,然后忽略其中的所有内容。然后,我们告诉Git忽略所指定目录“之外”的所有内容。这是相同的语法,但是按照Git的顺序进行:

wordpress/*                            # Ignore everything inside here
!wordpress/wp-content                  # Apart from this directory

wordpress/wp-content/*                 # Ignore everything inside here
!wordpress/wp-content/themes           # Apart from this directory

wordpress/wp-content/themes/*          # Ignore everything inside here
!wordpress/wp-content/themes/my-theme  # Apart from this directory

希望这可以帮助某人更好地了解对递归方法的需求。


3

晚到派对,但这是我用于未知深度的方法(公认的解决方案需要已知深度)

/*
!.gitignore
!wp-content/
!*/

这样,wp-content下的所有内容都不会被忽略。


3

多次需要后,我终于找到了解决方案[1]:

/*/
/*.*
!.git*
!/wordpress

逐行说明:

  1. 忽略根目录下的所有目录
  2. 忽略所有带有扩展名的文件。
  3. 允许.gitignore自己(并可能.gitattributes)。
  4. 允许包含所有子目录的所需目录

[1] 限制(我知道):

  1. 它不会忽略没有扩展名的文件(添加文件/*会破坏整个方案)。
  2. 您想要包含在第4行中的目录(wordpress在这种情况下)不能包含.名称(例如,wordpress.1将不起作用)。如果它确实有一个.,则删除第2行并找到另一种方法来排除根目录中的所有文件。
  3. 仅在Windows上使用 git version 2.17.1.windows.2

3

另一个简单的解决方案:

您想忽略所有Wordpress文件,而不是主题(例如)。

.gitignore,内容是:

# All wordpress + content of revert ignored directories
wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*

# Revert ignoring directories
!wordpress/
!wordpress/wp-content/
!wordpress/wp-content/themes/
!wordpress/wp-content/themes/my_theme

在此示例中,如果.gitignore位于根wordpress目录中,则可以删除wordpress

您可以对每个要“例外”地保留在gitignored文件夹/文件之外的文件夹和内容执行完全相同的操作

结论:

确保取消忽略要忽略的路径的所有目录

确保忽略所有要忽略的目录的内容


2

您可以尝试以下方法:

!**/themes/*

哪里

  • :否定忽略(包括)
  • **:任何目录树(递归),因此您不必指定文件夹路径
  • 主题:您要包含的文件夹(可以是任何内容)
  • *:该文件夹中的任何文件,您也可以将所有子文件夹都包含在**中,而不是包含任何文件(*),您可以指定* .css,*。xy

2

这是我的解决方案,其中假设已签入 wp-content

# Ignore everything except directories
*
!*/

# except everything in the child theme and its required plugin
!/themes/mytheme-child/**
!/plugins/my-plugin/**

# and this file
!.gitignore

和测试:

git version 2.20.1 (Apple Git-117)
$ git check-ignore -v .foo foo foo/ themes/foo themes/foo/bar themes/mytheme-child \
themes/mytheme-child/foo plugins/foo plugins/my-plugin plugins/my-plugin/foo .gitignore
.gitignore:2:*  .foo
.gitignore:2:*  foo
.gitignore:2:*  foo/
.gitignore:2:*  themes/foo
.gitignore:2:*  themes/foo/bar
.gitignore:2:*  themes/mytheme-child
.gitignore:6:!/themes/mytheme-child/**  themes/mytheme-child/foo
.gitignore:2:*  plugins/foo
.gitignore:2:*  plugins/my-plugin
.gitignore:7:!/plugins/my-plugin/** plugins/my-plugin/foo
.gitignore:10:!.gitignore   .gitignore

因此它正确地忽略了我不想要的一切,也不想保留任何东西。

发行码

根据https://docs.gitlab.com/ee/workflow/repository_mirroring.html,Gitlab配置有用于受保护分支的存储库镜像。

将代码推送到受保护的分支后,它将镜像到裸仓库中的登台服务器和生产服务器/opt/checkout/repo.git/。然后,以下post-receive挂钩(中的/opt/checkout/repo.git/hooks/post-receive)将把代码检出到工作目录中。

#!/bin/bash

BRANCH=staging
GIT_DIR=/opt/checkout/repo.git
GIT_WORK_TREE=/opt/bitnami/apps/wordpress/htdocs/wp-content

# on push, checkout the code to the working tree
git checkout -f "${BRANCH}"

# ensure permissions are correct
sudo chown -R bitnami:daemon "${GIT_WORK_TREE}"
sudo chmod -R go-w "${GIT_WORK_TREE}"

有关更多信息,请参见https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps


1

这是我的做法:

# Ignore everything at root:
/*

# Except for directories:
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/

# Except files:
!README

#Except files of type:
!*.txt

这对我有用。允许您忽略除特定文件或文件夹之外的所有内容

macOS Sierra


0

我在同一条船上,试图在一个仓库中管理一堆Wordpress网站。我的目录结构如下所示:

root (git repo)
(WordPress Site 1)/app/public/wp-content/themes
(WordPress Site 2)/app/public/wp-content/themes
(WordPress Site 3)/app/public/wp-content/themes

我只想跟踪app/public每个站点文件夹中的项目。我尝试了此页面中的示例以及此处的一些建议,最后尝试了以下方法:

/(WordPress Site 1)/*
!(WordPress Site 1)/app
(WordPress Site 1)/app/*
!(WordPress Site 1)/app/public

可行,但对于每个站点,我都必须忽略相同的路径,这是我想要避免的。

然后,我只是用替换了站点的名称,这*为我解决了问题。所以这就是我最终使用的:

/*/*
!*/app
*/app/*
!*/app/public

这有效地忽略了站点文件夹中的所有内容,同时捕获app/public了我在根目录中创建的任何站点的文件夹中的所有内容。

注意,它不会忽略根目录中的文件,只是目录:)

希望这可以帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.