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

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

我用过。Gitignore 文件忽略文件类型之前,但它可以被用来反过来-即忽略一切,但某个文件夹路径?

Root (git repo)
-/wordpress
-/(WordPress Site 1)/wp-content/theme
-/(WordPress Site 2)/wp-content/theme
-/(WordPress Site 3)/wp-content/theme < br >

谢谢

更新:

基于以下的答案,我做了以下的,但它不工作。有什么想法吗?

# 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文件夹。

116851 次浏览

试试这些答案:

忽略除少数文件之外的所有内容

# Ignore everything
*


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


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

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

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

/*
/*/
!/bin/

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

如果你在一个模式前面加上一个叹号(!) ,它会否定之前排除它的任何模式。因此,可以假设,您可以忽略所有内容,然后只允许使用这个模式来实现您想要的内容。

我是这样做的——你基本上必须沿着路径走,你不能在任何方向上通配多个级别:

# 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个子目录,我仍然需要将它们拼写出来。

我就是这么做的。如果有人想尽一切办法提供一个更有根据的解释。

此外,这些答案也很有帮助:
被否定的模式如何在吉蒂诺尔工作
如何做-吉蒂诺雷-排除-规则-实际上-工作 < br >


注意: 我尝试使用双通配符‘ globs’,但是根据 这个,这个功能是系统依赖的,在我的 Mac 上无法工作:

失败:

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

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

我尝试了上面的方法,但是效果不是很好。一个更好的方法是从这里开始: 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/

对于那些寻找 清洁工解决方案,请尝试以下内容。

正如在 这个答案的注释中提到的,您必须递归地使用这个方法。

在这个例子中,你有一个网站设置在 ./,你的 .git文件夹和 .gitignore文件位于和一个 WordPress 安装设置在 ./wordpress。要正确忽略 ./wordpress目录下的所有内容 除了主题目录本身(wordpress/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

希望这能帮助人们更好地理解对递归方法的需求。

修改第一行

*

改成

/*

假设您有这样一个目录结构:

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

当你想要 只允许站点/全部/文件/私有/新闻图站点/default/files/private/newsilot的时候,你可以先试试这个:

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

这是不对的!Gitignore 的一个棘手之处在于,在提交中允许包含它的子目录(“ newsilot”)之前,需要先处理 必须首先允许包含父目录(“ private”)

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

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

在这个问题上,我总是卡在某个地方,即使在回到这个问题无数次之后。我想出了一个详细的步骤:

首先使用 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

我也在同一条船上,试图用一个回购协议来管理一堆 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文件夹中的所有内容。

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

希望这个能帮上忙。

我是这么做的:

# 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

虽然晚了一些,但这里是我用于未知深度的方法(公认的解决方案需要已知深度)

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

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

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

对我来说,这很有用

# Ignore everything
/*


# Not these directories
!folder/


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

你可以试试这个:

!**/themes/*

在哪里 :

  • ! : 否定忽略(包括)
  • * * : 任意目录树(递归) ,所以不必指定文件夹路径
  • 主题: 要包含的文件夹(可以是任何内容)
  • * : 该文件夹中的任何文件,您可以包含所有子文件夹以及 * * ,而不是包含任何文件(*) ,您可以具体 * 。Css * .Xy

经过多次的需求,我终于找到了一个解决方案[1] :

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

逐行解释:

  1. 从根本上忽略所有 目录
  2. 忽略所有在根目录下有扩展名的文件。
  3. 允许 .gitignore本身(可能还有 .gitattributes)。
  4. 允许所需的目录 包含所有子目录

[1] 限制(据我所知) :

  1. 它不会忽略根目录下没有扩展名的文件(并且添加 /*会破坏整个方案)。
  2. 您希望包含在第4行中的目录(在本例中为 wordpress)不能在名称中包含 .(例如,wordpress.1不能工作)。如果它确实有 .,那么删除第2行并找到另一种方法排除根目录下的所有文件。
  3. 仅在使用 git version 2.17.1.windows.2的 Windows 上测试

这里是我的解决方案,它假设一个到 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

另一个简单的解决办法:

你想要忽略所有的 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

在本例中,如果 。吉蒂诺尔Root wordpress 目录中,则可以删除 WordPress

您可以对每个希望“特别”避免被忽略的文件夹/文件的文件夹和内容执行完全相同的操作

结论:

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

但是

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