.gitignoreにいくつかのファイルを除いてすべてを無視させる


1701

.gitignoreファイルがGitのバージョン管理から指定されたファイルを隠蔽していることを理解しています。実行時に多くの追加ファイル(.auth、.dvi、.pdf、ログなど)を生成するプロジェクト(LaTeX)がありますが、それらを追跡したくありません。

フォルダーを無視するだけでよいので、これらのすべてのファイルをプロジェクトの別のサブフォルダーに配置できるように(多分そうする必要がある)と認識しています。

しかし、出力ファイルをプロジェクトツリーのルートに保持し、.gitignoreを使用して、Gitで追跡しているファイル以外のすべてを無視する実行可能な方法はありますか?何かのようなもの

# Ignore everything
*

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

12
stackoverflow.com/q/9162919/321973の重複(私はそれが新しいことを知っていますが、答えはより正確です)。実際、この答えはおそらく最高です
Tobias Kienzler '09 / 10/9

回答:


2442

!パターンを否定するオプションのプレフィックス。以前のパターンによって除外された一致するファイルは、再び含まれます。否定されたパターンが一致する場合、これは優先順位の低いパターンソースをオーバーライドします。

# Ignore everything
*

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

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

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

14
これもサブフォルダーを「無視」するように見えます。そのため、ルートディレクトリ以外の場所にある「script.pl」という名前のファイルはいずれにしても見つかりません。私はこれを現在使用しています(* .plを使用)。.gitignoreファイルの下のサブディレクトリに多くあるにもかかわらず、すべての* .plファイルは無視されています
PandaWood

38
@PandaWoodその問題はここで取り上げられました(stackoverflow.com)。これは、ディレクトリを含むすべてに一致する最初の式によって引き起こされます。修正するには、(!* /)を追加します。これは、現在のディレクトリのすべてのサブディレクトリに(再帰的に)一致します。これは、特定のファイルをホワイトリストに登録するという親の回答には役立ちません(サブディレクトリにある場合は、手動でフルパスを指定するか、ディレクトリ固有の.gitignoreファイルを使用することをお勧めします)。
simont

40
これを機能させることができませんでした。フォルダー(例wp/:)を無視していますが、そのフォルダー(例:)の深いファイルを無視したくありませんwp/path/to/some/location/*。私がそれを機能させる唯一の方法は、実行することでしたgit add -f wp/path/to/some/location/*
trusktr

13
@trusktr simontの!*/例外を使用
Tobias Kienzler、

7
最後のルールであるGeezは!*/.gitignoreファイルを動作させるための無駄な試みにすべての違いをもたらします。どうもありがとうございました。
racl101、2015年

628

ディレクトリー内の1つのファイルを除いてディレクトリーの内容全体を無視したい場合は、ファイル・パス内のディレクトリーごとに1組の規則を作成できます。例:.gitignoreは、pippo / pluto / paperino.xml以外のpippoフォルダーを無視します

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

58
優秀な答えは、しかし、それの価値が、後に、この出くわす誰のために注目fooしてfoo/*いるではない同じ。これを機能させるfoo/*は、ベースフォルダーを使用する必要があります
thislooksfun

20
@Mayank Pippoはイタリア語でグーフィー、Paperinoはドナルドダック、Plutoは英語と同じです。かつては、サンプルをプログラミングするための変数名の非常に一般的なトリプレットでした。もう一度読んでよかったです.. :)
Ghidello

「ファイルx以外のフォルダを除外する」場合、@ thislooksfunが言うことは重要です。
チェコ語(2017年

8
私には機能しません:node_modules / *!node_modules / bootstrap
SuperUberDuper

1
@simple_humanリポジトリのルートのすべてを無視していた場合、または言及したディレクトリ内の.gitignoreファイルを気にしていた場合は、これが当てはまります。
xZero

245

/*代わりに、*または*/ほとんどの場合に使用したい

使用*は有効ですが、再帰的に機能します。それ以降はディレクトリを調べません。人々は!*/再びディレクトリをホワイトリストに登録することを推奨しますが、実際には最上位のフォルダーをブラックリストに登録する方が良いです/*

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

上記のコードは、以外のすべてのファイルを無視するだろう.gitignoreREADME.mdfolder/a/file.txtfolder/a/b1/およびfolder/a/b2/それらの最後の2つのフォルダに含まれるすべてのもの。(そして.DS_Store*.logファイルはそれらのフォルダーでは無視されます。)

明らかに私は、例えば!/folder!/.gitignoreあまりにもすることができました。

詳細:http : //git-scm.com/docs/gitignore


3
とても賢い、ありがとう。IMO、これは、最小数の包含ルールを持つWordPressサイトでそれを行うための最良の方法です。また、新しいプラグイン、テーマ、WPの更新は、明示的な許可なしに削除または追加されません。GitHubデスクトップを使用すると、.DS_Storeファイルが無視されないことがわかりますが、コマンドラインを使用しても問題ありません。これを回避するには、**/.DS_Store他のすべてのルールの下に移動する必要がありました。
ジブラン、

7
私の内部構文ハイライターはあなたの投稿のタイトルに奇妙な反応をしています。
itsadok

3
グラシアス!フォルダ内のファイルをホワイトリストに登録することもできます。!/some/folder/file.txt
PodTech.io

*の代わりに/ *を使用すると、上記の回答で解決できなかったすべての問題が修正されました。私の唯一の質問は、!/ folderと!/ folder / *の違いは何ですか?*なしで!/ folderを使用した場合でも、私の知る限り、フォルダー内のすべてのファイルに対する変更が取得されます。
ダリン

1
@dallin違いはありません。1つはフォルダーをホワイトリストに登録し、もう1つは同じフォルダーの子をホワイトリストに登録します。あなたが行うことができないので、唯一の問題は、フォルダやファイルの親は、それがホワイトリストに登録することができます前に、ホワイトリストに登録する必要があり/*、その後!/nested/folder/*(または同等!/nested/folderやっなし)!/nested/または!/nested最初に!(そしておそらくその/nested/*中間)。覚えておくべき秘訣は、深くネストされたサブフォルダーをホワイトリストに登録する場合、各サブフォルダーの子をすべて黒くする必要があり、それらのブラックリストは「スラッシュスター」で終わることになります...
Ryan Taylor

75

もう少し具体的:

例:のすべてを無視しますwebroot/cache-保持しwebroot/cache/.htaccessます。

cacheフォルダーの後のスラッシュ(/)に注意してください。

失敗する

webroot/cache*
!webroot/cache/.htaccess

WORKS

webroot/cache/*
!webroot/cache/.htaccess

VS Codeを使用している場合、これを.gitkeepを含むフォルダーに適用した後、ファイルの色を誤って読み取らないように注意してください。フォルダー名は緑色に変わりますが、.gitkeepファイルは他のすべての無視されたファイルと同じように灰色になります。.gitkeepは無視されたように見えますが、右側に「U」が表示され、それが検出されたことを示しています
OzzyTheGiant


28

ディレクトリ内の一部のファイルを無視するには、これを正しい順序で行う必要があります

たとえば、index.phpとフォルダー「config」を除くフォルダー「application」のすべてを無視します。順序に注意してください

あなたが最初にしたいことを否定する必要があります。

失敗する

application/*

!application/config/*

!application/index.php

WORKS

!application/config/*

!application/index.php

application/*


38
違う。あなたは「すべてを無視する」の後に否定します。
カルロス、

2
git status変更が.gitignore期待どおりに機能するかどうかを確認するためにだまされないでください
PhilippeRathé13年

10
場合git status、それは見ていると何を無視している何を言うつもりはないされ、これが動作しているか、そしてどのように知ることができますか?
kris

1
@kris最初にgitキャッシュをクリアします。最初に「git rm --cached *」を実行してから、「git add --all」を実行してから、「git status」で新しいgitignoreの変更をすべて表示します。
マークマコー

20

あなたが使用することができgit config status.showUntrackedFiles no、すべての追跡されていないファイルはあなたから隠されます。詳細man git-configについては、を参照してください。


これは、多くのファイルから数個のファイルをコミットするだけの場合に最適です。
Josh M.

16

.gitignoreからフォルダーを除外するには、次のようにします。

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

これにより、をbower_components除くすべてのファイル/サブフォルダが無視され/highchartsます。


14

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

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

# 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 and files if you wish:
!wordpress/somefile.jpg
!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/**/*

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


2
これは、特定のファイル拡張子を排他的に含めるように機能する唯一の方法です。さらに良いことに、それはすばらしいASCIIアートになります:gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
Matthew D. Scholefield

10

サブフォルダに問題がありました。

動作しません:

/custom/*
!/custom/config/foo.yml.dist

作品:

/custom/config/*
!/custom/config/foo.yml.dist

9

上記のすべての答えを試しましたが、うまくいきませんでした。gitignoreのドキュメント(ここ)を読んだ後、最初にフォルダを除外すると、サブフォルダ内のファイル名にインデックスが作成されないことがわかりました。したがって、後で感嘆符を使用してファイルを含めると、そのファイルはインデックスに見つからないため、gitクライアントに含まれません。

それが解決策を見つける方法でした。フォルダツリーのすべてのサブフォルダに例外を追加して、それを機能させることから始めましたが、これは大変な仕事です。その後、詳細な構成を以下の構成に圧縮することができました。これは、ドキュメントに少し反しています。

作業中の.gitignore:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

その結果、私のgitクライアントでは、Pro / 3rdparty / domain / modulename /フォルダー内の2つのファイルのみが次のコミットのためにステージングされていることがわかり、まさにそれが私が探していたものでした。

また、同じフォルダのいくつかのサブフォルダをホワイトリストに登録する必要がある場合は、次のように、excludeステートメントの下に感嘆符の行をグループ化します。

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

それ以外の場合は、期待どおりに機能しません。


最後にうまくいった答え。.gitignoreが実際にどのように機能するかをいつ理解するのか疑問に思います
David

8

それが私にとってうまくいきました、私はリポジトリに1つのCordovaプラグインのみをコミットしたいと思いました:

...
plugins/*
!plugins/cordova-plugin-app-customization

8

私はパーティーに遅れていることを知っていますが、これが私の答えです。

@Joakimが言ったように、ファイルを無視するには、以下のようなものを使用できます。

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

しかし、ファイルがネストされたディレクトリにある場合、手動でルールを記述するのは少し難しいです。

例えば、我々はすべてのファイルをスキップしたい場合はgit、プロジェクトではなくa.txtに位置していますaDir/anotherDir/someOtherDir/aDir/bDir/cDir。すると、.gitignoreこんな感じになります

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

上記の .gitignoreファイルは、すべてのディレクトリとファイルをスキップします!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

お気づきかもしれませんが、これらのルールを定義することは困難です。

このハードルを解決するため、ルールを生成するgit-do-not-ignoreという名前のシンプルなコンソールアプリケーションを作成しました。私は詳細な手順とともにgithubでプロジェクトをホストしました。

使用例

java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

出力

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

こちらにも簡単なウェブ版があります

ありがとうございました。


7

私はバウアーからJqueryとAngularを持っています。Bowerはそれらをインストールしました

/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

最小化されたjqueryはdistディレクトリ内にあり、angularはangularディレクトリ内にあります。GitHubにコミットするのに必要なファイルは最小限に抑えられました。.gitignoreを改ざんする人もいます。これがなんとか思いついたものです...

/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

誰かがこれが役立つと思います。


7

これは私がそれをした方法です:

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

gig status -u追跡されていないディレクトリ内の個々のファイルを再帰的に表示するために使用します- git statusフォルダーのみが表示されるため、ファイル内のすべてが追跡されていると勘違いする可能性があります


5

少数のファイルと少数のルートフォルダを除いてすべてを無視する必要がある場合の簡単な解決策:

/*
!.gitignore
!showMe.txt
!my_visible_dir

/*(上記のように)魔法は(ルート)フォルダー内のすべてを無視しますが、再帰的には行いません。


4

また、単一ファイルの否定に関するいくつかの問題がありました。私はそれらをコミットすることができましたが、私のIDE(IntelliJ)は常に、追跡されている無視されたファイルについて不平を言っていました。

git ls-files -i --exclude-from .gitignore

この方法で除外した2つのファイルを表示しました。

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

結局、これは私にとってうまくいきました:

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

重要なのは、最初にフォルダを否定することでした typo3conf/

また、ステートメントの順序は問題ではないようです。代わりに、その中の1つのファイルを無効にする前に、すべてのサブフォルダーを明示的に無効にする必要があります。

フォルダー!public/typo3conf/とフォルダーの内容public/typo3conf/*は、.gitignoreの2つの異なるものです。

素晴らしいスレッド!この問題はしばらくの間私を悩ませました;)


3

libからjarを1つ追加しようとしていたため、これまでのところ何も機能しません。

これはうまくいきませんでした:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

これはうまくいきました:

build/*
!build/libs

3

私はこれを機能させました

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib

2

OPと同様の問題がありましたが、上位10件の回答が実際に機能しませんでした
私は最終的に以下を見つけました

間違った構文:

*
!bin/script.sh

正しい構文:

*
!bin
!bin/script.sh

gitignore manページからの説明:

オプションの接頭辞「!」これはパターンを無効にします。以前のパターンによって除外された一致するファイルは、再び含まれます。そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。Gitはパフォーマンス上の理由で除外されたディレクトリをリストしません。そのため、含まれているファイルのパターンは、それらが定義されている場所に関係なく、効果がありません。

拡張例:

$ツリー。

.
├── .gitignore
└── bin
    ├── ignore.txt
    └── sub
        └── folder
            └── path
                ├── other.sh
                └── script.sh

$猫.gitignore

*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh

$ git status --untracked-files --ignored

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        bin/sub/folder/path/script.sh

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        bin/ignore.txt
        bin/sub/folder/path/other.sh

nothing added to commit but untracked files present (use "git add" to track)

1

要旨

# Ignore everything
*

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

そしておそらく含める:

!.gitignore

参照

https://git-scm.com/docs/gitignoreから:

!パターンを否定するオプションの接頭辞 " "。以前のパターンによって除外された一致するファイルは、再び含まれます。そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。Gitはパフォーマンス上の理由で除外されたディレクトリをリストしません。そのため、含まれているファイルのパターンは、それらが定義されている場所に関係なく、効果がありません。\" !"のように、リテラル " !"で始まるパターンの最初の " "の前にバックスラッシュ( " ")を置きます\!important!.txt

...

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

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

0

他の誰にも言われていない、私にとってはうまくいく何かを見つけたようです。

# Ignore everything
*

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

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

基本的に、それはサブディレクトリが無視されるのを無効にするようです、あなたは2つのエントリを持っている必要があります、1つはサブディレクトリ自体のためのもので、!subdir/もう1つはその下のすべてのファイルとフォルダに展開するものです!subdir/**/*

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