web-dev-qa-db-ja.com

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

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

フォルダを無視することができるので、これらのファイルをすべてプロジェクト内の別々のサブフォルダに入れるようにすることができます。

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

# Ignore everything
*

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

パターンを無効にするオプションの接頭辞!。前のパターンで除外された一致ファイルはすべて再び含まれます。否定パターンが一致すると、優先順位の低いパターンのソースが上書きされます。

# 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/*
1969
Joakim Elofsson

ディレクトリ内の1つのファイルを除いてディレクトリの内容全体を無視したい場合は、ファイルパス内の各ディレクトリに対して一対の規則を記述できます。例えばpippo/pluto/paperino.xml以外のpippoフォルダーを無視するための.gitignore

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml
539
Giuseppe Galano

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

*の使用は有効ですが、再帰的に機能します。それ以降はディレクトリを調べません。 !*/を使用してディレクトリを再度ホワイトリストに登録することをお勧めしますが、実際には/*を使用して最上位レベルのフォルダをブラックリストに登録することをお勧めします。

# 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

190
Ryan Taylor

もう少し具体的な:

例:webroot/cache内のすべてを無視します - ただし、webroot/cache/.htaccessをそのままにします。

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

_失敗_

webroot/cache*
!webroot/cache/.htaccess

_作品_

webroot/cache/*
!webroot/cache/.htaccess
68
Nik
# ignore these
*
# except foo
!foo
53
Suvesh Pratapa

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

たとえば、index.phpと "config"以外の "application"フォルダ内のすべてを無視します 次の順序に注意してください

あなたはあなたが最初に欲しいと思うことを否定しなければなりません。

_失敗_

application/*

!application/config/*

!application/index.php

_作品_

!application/config/*

!application/index.php

application/*

25
slatunje

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

19
Robert Munteanu

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

!app/

app/*
!app/bower_components/

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

これは、bower_componentsを除く/highcharts内のすべてのファイル/サブフォルダーを無視します。

14
Guy Baskin

これについても同様の質問がたくさんありますので、私が以前に書いたものを投稿します。

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

# 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/**/*

どちらも私にとってはうまくいきませんでした。歩道とエラーがたくさん!

12
Katie S

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

動作しません:

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

作品:

/custom/config/*
!/custom/config/foo.yml.dist
9
Fabian Picone

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

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

私はJqueryとAngularをbowerから持っています。 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ディレクトリの中にあり、angleは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
Mario Legenda

私は上で与えられたようにすべての答えを試みました、しかし、どれも私のために働きませんでした。 gitignoreのドキュメントを読んだ後( here )、最初にフォルダーを除外した場合、サブフォルダー内のファイル名がインデックスされていないことがわかりました。そのため、後で感嘆符を使用してファイルをインクルードしても、インデックスには含まれないため、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/

そうでなければそれは期待どおりに動作しません。

5
Tim B.

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

# 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を使用すると、フォルダのみが表示されます

4
zok

私はパーティーに遅刻することを知っている、しかしここに私の答えがある。

@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

簡単なウェブ版もあります ここ

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

4
theapache64

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

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

私はこの方法で除外した二つのファイルを表示しました:

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

最後に、これは私のために働きました:

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

キーはフォルダの否定typo3conf/が最初でした。

また、ステートメントの順序は重要ではありません。代わりに、単一のファイルを無効にする前に、すべてのサブフォルダを明示的に無効にする必要があります。

フォルダ!public/typo3conf/とフォルダの内容public/typo3conf/*は、.gitignoreでは2つの異なる点があります。

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

3
Armin

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

/*
!.gitignore
!showMe.txt
!my_visible_dir

マジックは/*にあります(上で説明されたように)それは再帰的にではなく(ルート)フォルダの中のすべてを無視します。

3
d.raev

Libからjarファイルを1つ追加しようとしていたので、これまでのところ何もうまくいきませんでした。

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

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

これはうまくいった:

build/*
!build/libs
3
Manish Bansal

私はこれがうまくいった

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

他の誰も言及しなかった、私のために働いた何かを見つけたようです。

# 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/**/*

0
Didier A.