.gitignoreを使用して特定のディレクトリ以外をすべて無視する


140

私の問題は、gitリポジトリにthemes多数のWordPress Webサイトがあり、WordPressにある残りの冗長ファイルを無視して、フォルダーのコンテンツのみを選択的にコミットすることです。

以前に.gitignoreファイルを使用してファイルの種類を無視しましたが、逆に使用できます。つまり、すべてを無視することですが、特定のフォルダーパスを無視することはできますか?

root(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フォルダを読みません。

回答:


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つのサブディレクトリがある場合でも、それを詳しく説明する必要があります。

これは私にとってそれがどのように機能したかだけです。誰かがより多くの情報に基づいた説明を必ず提供したいと思っている場合。

また、これらの回答は役に立ちます:
how-do-negated-patterns-work-in-gitignore
how-do-gitignore-exclusion-rules-actually-work


注:私は、二重ワイルドカード「グロブ」を使用しますがに応じて試してみました。この機能はシステムに依存し、それは私のMac上で作業しなかったこと。

動作しませんでした:

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

4
git 1.8.4より前の**ワイルドカードは、パターンにスラッシュがない場合にのみ機能します。sparethought.wordpress.com

これは動作するはずです:!/wordpress/*/wp-content/themes/**/*
that0n3guy

1
この構文はWindowsで機能しますか?それは私のために働いていないようです...
ScottF

Windows 10で動作します。VisualStudio Codeのあらゆる種類のカスタムプロジェクトに使用できます。
klewis

この回答と@吴毅凡から提供された回答を組み合わせて使用​​しました。
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-特定のワードプレスのディレクトリに根ざしレポのために有用this-ルックスを共有するためのおかげで、それの下に複数のWordPressサイトのwレポ上では動作しません、@
Yarin

この構造/モデルは非常に役立ちます。MagentoとWPを組み合わせてインストールするための単一のリポジトリが必要でした。この手法を使用した.gitignoreの行が30行未満の場合、Magentoテーマ/スキンファイルとWPテーマファイルのみに絞り込むことができました。ありがとう!
random_user_name

初心者のgitユーザーがインデントされた領域の外にあるファイルをめちゃくちゃにする可能性があるため、この設定を自動展開で使用しないでください(つまり、リポジトリ内のすべてのファイルを誤って削除し、自動展開すると混乱します)。それ以外はうまくいきます。
dwenaus 2013年

あなたは男だ!特に、バージョンが2.1.4以上の場合。参照:git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

最初の行を変更する

*

に変更

/*

2
この仕事は私にとって。私の.gitignoreファイルは次のようになります/ *!.gitignore!/
vendors

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
私が投稿した2番目のリンクは、!*/wp-content/themes/との両方が必要になると言っています!*/wp-content/themes/*。そのバリエーションを試しましたか?また、代替手段として、あなただけ使用することができ!*/wp-content/themes/、各テーマディレクトリ内で独自の.gitignoreファイルを持っている!*
刺激

1
@ irritate-そのバリエーションも機能しない、とにかく私はそれがどのように異なるかはわかりません!*/wp-content/themes*
Yarin

9

パターンの前に感嘆符(!)を付けると、それを除外した以前のパターンはすべて無効になります。したがって、おそらくすべてを無視して、このパターンを使用することで必要なものだけを許可することができます。


@ dappawit-Thanks-コンセプトは理にかなっており、テーマフォルダーではなく、ファイルに対しては機能します
Yarin

私はglobパターンの専門家ではありませんが、.gitignoreのmanページを読んで、これでうまくいくと思います!wordpress/[write out directories]/wp-content/themes/。終了スラッシュと終了アスタリスクがないことに注意してください。また*、は1つのレベルにのみ一致し、複数のディレクトリには一致しないことに注意してください。これがmanページです:kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit

私は他のルールの後に感謝否定を入れていた実現助けた
アックス

6

私はすべてを無視する必要がありましたが、サブディレクトリのある1つのフォルダではありませんでした。

私にとって、これは機能します

# Ignore everything
/*

# Not these directories
!folder/

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

5

次のようなディレクトリ構造があるとします。

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

サイト/すべて/ファイル/プライベート/ニュースパイロットのみを許可する場合およびサイト/デフォルト/ファイル/プライベート/の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

ヤリンの答えは私のために働きました、これは私のバージョンです(私は/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がまだ完了したときにUntrackedとして表示される唯一のことです。

ルールの追加を開始します。

.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

クリーナーをお探しの方ソリューション、以下をお試しください。

この回答のコメントで述べたように、このメソッドは再帰的に使用する必要があります。

この例で./は、.gitフォルダーと.gitignoreファイルが配置されている場所にWebサイトがあり、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

うまくいけば、これは誰かが再帰的な方法の必要性をよりよく理解するのに役立ちます。


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

そのため、私が必要としないものはすべて無視し、保持したいものは何も正しく無視します。

コードのリリース

Gitlabは、https: //docs.gitlab.com/ee/workflow/repository_mirroring.htmlに従って、保護されたブランチのリポジトリミラーで構成されています

コードが保護されたブランチにプッシュされると、そのコードはベアリポジトリのステージングサーバーと本番サーバーにミラーリングされます/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シエラ


0

私は同じボートに乗って、1つのリポジトリで多数の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し、ルートに作成したサイトのフォルダー内のすべてをキャプチャしました。

ルートのファイルは無視しません。ディレクトリのみです:)

お役に立てれば。


0

これは、他のユーザーと共有できるwp-config-sample.phpがあるため、ほとんどの場合無視される唯一のファイルです。

/wp-config.php
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.