.gitignoreフォルダーを除外するが、特定のサブフォルダーを含める


964

application/追加するフォルダがあります.gitignoreapplication/フォルダ内は フォルダですapplication/language/gr。このフォルダを含めるにはどうすればよいですか?

私はこれを試しました

application/
!application/language/gr/

運が悪い...


1
うまくいけば、「.gitignoreパターンフォーマット」のドキュメントがより明確になりました(2013年12月)。以下の私の回答を
VonC

お気に入りとブラウザのブックマークに追加された私のお気に入りの質問と回答。
codekiddy 2015年

回答:


1613

を除外するapplication/と、その下にあるすべてのものは常に除外されます(後で否定的な除外パターン(「unignore」)がの下にあるものと一致する場合でもapplication/)。

やりたいことを行うには、「無視」したいすべての親ディレクトリをすべて「無視」する必要があります。通常、この状況のルールはペアで記述します。ディレクトリ内のすべてを無視しますが、特定のサブディレクトリは無視します。

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/


末尾/*は重要です。

  • このパターンでdir/は、名前の付いたディレクトリとdirその下の(暗黙的に)すべてが除外されます。
    を使用するとdir/、Gitはの下dirにあるものを決して見ないため、「除外しない」パターンをの下にあるものに適用することはありませんdir
  • パターンdir/*dirそれ自体については何も言いません。下にあるものすべてを除外するだけdirです。を使用するとdir/*、Gitはの直接のコンテンツを処理し、dir他のパターンにコンテンツの一部を「除外しない」機会を提供します(!dir/sub/)。

12
末尾のアスタリスクは重要ですか?もしそうなら、意味の違いは何ですか?gitignoreのドキュメントで説明されているアルゴリズムに従って、末尾のスラッシュで終了すると、ディレクトリとそのディレクトリの下のパスに一致します。アスタリスクで終わると、グロブパターンとして扱われます。実験により、アスタリスクのバリアントが機能することが示されましたが、末尾のスラッシュで終わるものは示されていません。なぜそうなのか理解したいのですが。
se

123
@seh:はい、末尾/*が重要です。ディレクトリが除外されている場合、Gitはそのディレクトリの内容を確認しません。このパターンでdir/は、名前の付いたディレクトリとdirその下の(暗黙的に)すべてが除外されます。パターンdir/*dirそれ自体については何も言いません。下にあるものすべてを除外するだけdirです。を使用するとdir/、Gitはの下dirにあるものを決して見ないため、「除外しない」パターンをの下にあるものに適用することはありませんdir。を使用するとdir/*、Gitはの直接のコンテンツを処理し、dir他のパターンにコンテンツの一部を「除外しない」機会を提供します(!dir/sub/)。
Chris Johnsen、

7
ああ、それはそれを説明しています。gitignoreのドキュメントを何度読んでも、元に戻されたパターンが機能しない場合は理解できませんでした。あなたの説明で、それは今明らかです。gitignoreのドキュメントは、これを行う方法を説明するために、「レシピ」のセクションを必要とします。
seh

8
これをうまく機能させることができませんでした(クレイジーな.gitignoreファイル!)。代わりに、必要なディレクトリにcdした後、ファイルを強制的に追加しました。git add -f .
K0D4 2015

2
の出力に依存できないことに注意してくださいgit status。これは、最上位ディレクトリが追加されることを通知するだけです。代わりgit addに、トップレベルのディレクトリを実行するとgit status、パターンが一致したファイルのサブセットが(うまくいけば)リストされます。
Matthew Strawbridge

136

Karsten Blees(kblees)のGit 1.9 / 2.0(2014年第1四半期)のCommit 59856deは、そのケースを明らかにしています。

gitignore.txt:除外されたディレクトリの再帰的な性質を明確にする

!パターンを否定するオプションの接頭辞 " "。以前のパターンによって除外された一致するファイルは、再び含まれます。

そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。(*
*:git 2.8+で特定の条件が満たされない限り、以下を参照)
Gitはパフォーマンス上の理由で除外されたディレクトリをリストしないため、どこに定義されていても、含まれるファイルのパターンは効果がありません。

\" !"のように、リテラル " !"で始まるパターンの最初の " "の前にバックスラッシュ( " ")を置きます\!important!.txt

特定のディレクトリを除いてすべてを除外する例foo/bar/*スラッシュがない場合、ワイルドカードは内のすべても除外することに注意してくださいfoo/bar):

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

あなたの場合:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

特定のフォルダー内のファイルをホワイトリストに登録する前に、まずフォルダーをホワイトリストに登録する必要があります。


2016年2月/ 3月の更新:

git 2.9.x / 2.10(2016年半ば?)では、再インクルードされたパスにワイルドカードがない場合、そのファイルの親ディレクトリが除外されていれば、ファイルを再インクルードできる可能性があることに注意してください。

NguyễnTháiNgọcDuy(pcloudsがこの機能を追加しようとしています:

したがって、git 2.9以降では、これは実際に機能する可能性がありますが、最終的には元に戻りました。

application/
!application/language/gr/

私はgit for windowsの回答の最後に投稿された更新されたre-include構文を使用しようとしましたv2.8.1.windows.1が、動作しないようです:(
David Hancock

1
@DavidHancockすみません、私は答えを編集しました:これはまだ利用できません。
VonC

1
@DavidHancock私も:それは私が何度も編集しなければならなかった13以上のスタックオーバーフローの回答です!
VonC

5
Git 2.9が昨日リリースされました。回答に記載されているapplication/+ !application/language/gr/パターンを確認すると、期待どおりに機能しています。
Ray Shan

1
@RayShan Strange:その機能を取り消すリバートコミットは見ましたが、見ていません(そして、リリースノートgithub.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txtには言及されていません) .gitignoreルールを改善するコミット。
VonC、2016年

52

@Chris Johnsenの答えは素晴らしいですが、Gitの新しいバージョン(1.8.2以降)では、もう少し簡単な解決策として活用できる二重アスタリスクパターンがあります。

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

これにより、追跡するサブフォルダの親ディレクトリを「無視」する必要がなくなります。


Git 2.17.0(このバージョンの前にどれくらい早いかわからない。おそらく1.8.2に戻る)では**、ファイルに至るまでの各サブディレクトリーの除外と組み合わせたパターンを使用すると機能します。例えば:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder

9
残念ながら、これは失敗します(Git 1.8.4.msysgit.0)。これは、パターン**がゼロのサブフォルダーに*一致しlanguage、一致して除外されるため、が含まれないためですgr。@Chris Johnsonが推奨する親の完全なチェーンはまだ必要だと思われます。
Sean Gugler、2014

3
完璧に聞こえますが、git 2.3.7では動作しません... /www/**/* !/www/config.xml !/www/resconfig.xmlとresディレクトリは引き続き無視されます。
Rob

@Robあなたも追加する必要があります!/www/res/folder/**/*パターンを使用できますが、追加するサブディレクトリごとに除外を追加する必要があります。それでも、ignore / excludeコンボよりも短く、読みやすくなっています。
Ben Kane

古いコメントだと思いますが、気になる方のために。このアプローチを文書化した回答に編集を追加しました。
Ben Kane

21

これについては似たような質問がたくさんあるので、前に書いたことを投稿します。

これを自分のマシンで動作させる唯一の方法は、次のようにすることでした。

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

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

これは@Yarinのコメントからです:https : //stackoverflow.com/a/5250314/1696153

これらは有用なトピックでした:

私も試しました

*
*/*
**/**

そして **/wp-content/themes/**

または /wp-content/themes/**/*

それも私にとってはうまくいきませんでした。試行錯誤がたくさん!


1
注:.gitignoreファイルでも順序が重要であることを忘れないでください。そのため、!ルールは一番下に配置してください。
starbeamrainbowlabs


8

最も簡単でおそらく最善の方法は、ファイルを手動で追加してみることです(通常、これは.gitignore-styleルールよりも優先されます)。

git add /path/to/module

フラグ-N を追加する意図があり、すぐに追加しないことを提案することもできます。まだステージングする準備ができていない新しいファイルに対して、私はよくこれを行います。


これは、簡単に重複するQAになる可能性のあるものに投稿された回答のコピーです。可視性を高めるために、ここに再投稿しています。gitignoreルールの混乱を避ける方が簡単です。


2
この回答をありがとう。-fは.gitignoreにあるため、次のように追加する必要がありました。git add -f path / to / file
jasonflaherty

6

したがって、多くのプログラマーがnodeを使用しているためです。この質問を満たすユースケースは、たとえばnode_modules1つのモジュールmodule-aを除いて除外することです。

!node_modules/

node_modules/*
!node_modules/module-a/

2
gitバージョンでは機能しません2.10.2.windows.1
セバスチャン

1
gitバージョン2.10.2の場合は、この回答に
nalexn

👌素晴らしい👋👋。
Abdennour TOUMI 2017

6

追加の回答を追加します。

!/.vs/              <== include this folder to source control, folder only, nothing else
/.vs/*              <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/       <== then include this folder to source control, folder only, nothing else
!/.vs/config/*      <== then include all files inside the folder

ここに結果があります:

ここに画像の説明を入力してください


2
これは、視覚的に助けられた私にとって最も有用な答えでした。ありがとう!
Joel Murphy、

4

特に古いGitバージョンの場合、ほとんどの提案はそれほどうまく機能しません。その場合は、他の設定に関係なくコンテンツを含めたいディレクトリに別の.gitignoreを置き、そこに必要なものを許可します。

例:/.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

したがって、/ dependency_files内のすべて(.dllファイルも含む)は問題なく含まれています。


4

私はここで同様のケースを見つけました。デフォルトで.gitignoreは、laravelでは、アスタリスクを使用してすべてを無視してから、パブリックディレクトリを上書きします。

*
!public
!.gitignore

これは、OPシナリオに遭遇した場合には不十分です。

の特定のサブフォルダをコミットする場合はpublic、たとえばpublic/productsディレクトリに、サブフォルダの深さが1つ深いファイルを含めたいと考えていpublic/products/a/b.jpgこのように追加しても、正しく検出されません!/public/products!public/products/*など..

解決策は、すべてのパスレベルを上書きするために、このようなすべてのパスレベルのエントリを必ず追加することです。

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*

3

ディレクトリ構造をたどって、必要なものを正確に取得するもう1つの例です。注:除外しませんでしたLibrary/Library/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings

まさに私もやりたかったこと;-)
キッツェ

3

WordPressでは、これは私に役立ちました:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

3

gitignore-無視する意図的に追跡されていないファイルを指定します。

特定のディレクトリfoo / barを除くすべてを除外する例(/ *に注意してください-スラッシュがない場合、ワイルドカードはfoo / bar内のすべても除外します):

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

WordPressの別の例:

!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin

詳細はこちら:https : //git-scm.com/docs/gitignore


2

私は頻繁にこの回避策をCLIで使用します。ここでは、を設定する代わりに.gitignore、別の.includeファイルを作成し、直接または再帰的に無視してディレクトリに含めたい(サブ)ディレクトリを定義します.gitignore

したがって、私はさらに使用します

git add `cat .include`

ステージング中、コミット前。

OPには、.include次の行があるa を使用することをお勧めします。

<parent_folder_path>/application/language/gr/*

注:を使用すると、$ HOME(またはその他の特定のディレクトリ)を指定するためにcat(内で.include)エイリアスを使用できません。これは、上記のコマンドhomedir/app1/*git add使用して渡されたときの行がと表示されgit add 'homedir/app1/*'、単一引用符( '')で文字を囲むと、引用符内の各文字のリテラル値が保持され、エイリアス(homedirなど)が機能しなくなるためです(Bash Singleを参照)。引用)。

ここ.includeに私のリポジトリ使用するファイルの例があります。

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc

1

私はjqueryのプロダクションjsファイルを追跡したかったのですが、これはうまくいきました:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

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