Git
ファイルとフォルダを無視する
サーチ…
前書き
このトピックでは、不要なファイル(またはファイルの変更)をGitリポジトリに追加しないようにする方法について説明します。いくつかの方法(グローバルまたはローカルの.gitignore
、 .git/exclude
、 git update-index --assume-unchanged
、およびgit update-index --skip-tree
)がありますが、Gitはコンテンツを管理しています。無視すると、実際にはフォルダの内容 (ファイルなど)は無視されます。とにかく追加できないので、空のフォルダはデフォルトでは無視されます。
.gitignoreファイルでファイルとディレクトリを無視する
あなたのリポジトリに1つ以上の.gitignore
ファイルを作成することで、Gitが特定のファイルとディレクトリを無視するようにすることができます。
ソフトウェアプロジェクトでは、 .gitignore
は通常、ビルドプロセス中または実行時に生成されるファイルやディレクトリのリストが含まれています。 .gitignore
ファイルのエントリには、 .gitignore
指す名前またはパスが含まれます。
- キャッシュ、ログファイル、コンパイル済みコードなどの一時的なリソース
- 他の開発者と共有してはならないローカル構成ファイル
- ログインパスワード、鍵、資格情報などの秘密情報を含むファイル
最上位ディレクトリに作成すると、ルールはリポジトリ全体のすべてのファイルとサブディレクトリに再帰的に適用されます。サブディレクトリに作成すると、その特定のディレクトリとそのサブディレクトリにルールが適用されます。
ファイルまたはディレクトリを無視すると、次のようになりません。
- Gitによって追跡される
-
git status
やgit diff
などのコマンドによって報告される -
git add -A
ようなコマンドでステージングされます
トラッキングされたファイルを無視する必要がある異常な場合は、特別な注意が必要です。 See: Gitリポジトリにすでにコミットされているファイルを無視する 。
例
globファイルパターンに基づいて、 .gitignore
ファイル内のルールの一般的な例をいくつか示します 。
# Lines starting with `#` are comments.
# Ignore files called 'file.ext'
file.ext
# Comments can't be on the same line as rules!
# The following line ignores files called 'file.ext # not a comment'
file.ext # not a comment
# Ignoring files with full path.
# This matches files in the root directory and subdirectories too.
# i.e. otherfile.ext will be ignored anywhere on the tree.
dir/otherdir/file.ext
otherfile.ext
# Ignoring directories
# Both the directory itself and its contents will be ignored.
bin/
gen/
# Glob pattern can also be used here to ignore paths with certain characters.
# For example, the below rule will match both build/ and Build/
[bB]uild/
# Without the trailing slash, the rule will match a file and/or
# a directory, so the following would ignore both a file named `gen`
# and a directory named `gen`, as well as any contents of that directory
bin
gen
# Ignoring files by extension
# All files with these extensions will be ignored in
# this directory and all its sub-directories.
*.apk
*.class
# It's possible to combine both forms to ignore files with certain
# extensions in certain directories. The following rules would be
# redundant with generic rules defined above.
java/*.apk
gen/*.class
# To ignore files only at the top level directory, but not in its
# subdirectories, prefix the rule with a `/`
/*.apk
/*.class
# To ignore any directories named DirectoryA
# in any depth use ** before DirectoryA
# Do not forget the last /,
# Otherwise it will ignore all files named DirectoryA, rather than directories
**/DirectoryA/
# This would ignore
# DirectoryA/
# DirectoryB/DirectoryA/
# DirectoryC/DirectoryB/DirectoryA/
# It would not ignore a file named DirectoryA, at any level
# To ignore any directory named DirectoryB within a
# directory named DirectoryA with any number of
# directories in between, use ** between the directories
DirectoryA/**/DirectoryB/
# This would ignore
# DirectoryA/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryW/DirectoryB/
# To ignore a set of files, wildcards can be used, as can be seen above.
# A sole '*' will ignore everything in your folder, including your .gitignore file.
# To exclude specific files when using wildcards, negate them.
# So they are excluded from the ignore list:
!.gitignore
# Use the backslash as escape character to ignore files with a hash (#)
# (supported since 1.6.2.1)
\#*#
ほとんどの.gitignore
ファイルは、さまざまな言語で標準的なファイルなので、ここでは、プロジェクトに複製またはコピー/変更するための言語でリストされた.gitignore
サンプルファイルのセットを.gitignore
します。また、新しいプロジェクトでは、 オンラインツールを使用してスターターファイルを自動生成することを検討することもできます 。
.gitignoreの他の形式
.gitignore
ファイルは、リポジトリの一部としてコミットされることを意図しています。無視ルールをコミットせずに特定のファイルを無視する場合は、次のオプションがあります。
-
.git/info/exclude
ファイルを編集します(.gitignore
と同じ構文を使用します)。ルールはリポジトリの範囲内でグローバルになります。 - すべてのローカルリポジトリに無視ルールを適用するグローバルなgitignoreファイルを設定します:
さらに、グローバルなgit設定を変更せずに、追跡されたファイルのローカル変更を無視することができます:
-
git update-index --skip-worktree [<file>...]
:マイナーローカル修正 -
git update-index --assume-unchanged [<file>...]
:プロダクションの準備ができていて変更のないファイル
さらなるオプションについては、後者のフラグとgit update-index
ドキュメントの 相違点の詳細を参照してください 。
無視されたファイルのクリーンアップ
git clean -X
を使用して、無視されたファイルをクリーンアップすることができます:
git clean -Xn #display a list of ignored files
git clean -Xf #remove the previously displayed files
注: -X
(大文字) は無視されたファイルのみを消去します。追跡されていないファイルも削除するには、 -x
(大文字なし)を使用します。
詳細については、 git clean
ドキュメントを参照してください。
詳細については、Gitのマニュアルを参照してください。
.gitignoreファイルの例外
パターンを使用してファイルを無視しますが、例外がある場合は、例外に感嘆符(!)を付けます。例えば:
*.txt
!important.txt
上の例は、 important.txt
という名前のファイルを除いて、拡張子が.txt
ファイルをすべて無視するようGitに指示します。
ファイルが無視されたフォルダにある場合は、そのファイルを簡単に組み込むことはできません 。
folder/
!folder/*.txt
この例では、フォルダ内のすべての.txtファイルは無視されたままです。
正しい方法は、フォルダ自体を別の行に入れなおしてから*
でfolder
すべてのファイルを無視し、最後に*.txt
を次のようにfolder
に再*.txt
ます。
!folder/
folder/*
!folder/*.txt
注 :感嘆符で始まるファイル名の場合は、感嘆符を2つ追加するか、 \
エスケープしてください:
!!includethis
\!excludethis
グローバル.gitignoreファイル
Gitがすべてのリポジトリで特定のファイルを無視するようにするには、端末またはコマンドプロンプトで次のコマンドを使用してグローバルな.gitignoreを作成します。
$ git config --global core.excludesfile <Path_To_Global_gitignore_file>
これでGitは各リポジトリの.gitignoreファイルに加えてこれを使用します。これに関するルールは次のとおりです。
- グローバルな
.gitignore
ファイルを無視しているときに、ローカルの.gitignore
ファイルにファイルが明示的に含まれている場合は、ローカルの.gitignore
が優先されます(ファイルがインクルードされます) - リポジトリは複数のマシンに複製されている場合は、グローバル
.gigignore
グローバルでのPC間、無視されたファイルは、レポに押し上げられるように、すべてのマシンにロードしなければならないか、または少なくともそれを含める.gitignore
それを更新しません。これは、プロジェクトがチームによって作業されている場合、リポジトリ固有の.gitignore
はグローバルなものより良いアイデアです
このファイルには、特定の無視、例えばOSXプラットフォーム、マシンまたはユーザーを維持するには良い場所です.DS_Store
、WindowsのThumbs.db
やVimが*.ext~
と*.ext.swp
あなたがリポジトリにそれらを保持しない場合は無視します。だから、 _MACOSX
働く1人のチームメンバーは、すべての.DS_STORE
と_MACOSX
(実際には役に立たない)を追加することができますが、Windows上の他のチームメンバーはすべてのthumbs.bd
すでにGitリポジトリにコミットされているファイルは無視する
既にGitリポジトリにファイルを追加していて、それを追跡しないようにして(将来のコミットには存在しないように)、それをインデックスから削除することができます:
git rm --cached <file>
これにより、リポジトリからファイルが削除され、それ以上の変更がGitによって追跡されなくなります。 --cached
オプションは、ファイルが物理的に削除されていないことを確認します。
以前に追加されたファイルの内容は、Gitの履歴から見ることができます。
索引からファイルを削除した後に他の誰かがリポジトリから引き出すと、 そのコピーは物理的に削除されることに注意してください 。
Gitは、ファイルの作業ディレクトリのバージョンが最新のものであるようにして、代わりに " skip worktree "ビットを使ってインデックスバージョンを読み込むことができます(そのため、変更は無視されます)。
git update-index --skip-worktree <file>
書き込みはこのビットの影響を受けず、コンテンツの安全性が最優先です。貴重な無視された変更を失うことはありません。一方、このビットはstashingと衝突します。このビットを削除するには、
git update-index --no-skip-worktree <file>
Gitに嘘をつけ、ファイルを調べずにファイルが変更されていないと仮定することは間違っていることがあります。一見すると、ファイルからのそれ以上の変更を無視して、インデックスから削除することなく見えます:
git update-index --assume-unchanged <file>
これにより、gitはファイル内の変更を無視します(このファイルに変更を加えたり隠したりすると無視される変更が失われることに注意してください )
gitにこのファイルを再度気にさせたい場合は、次のコマンドを実行してください:
git update-index --no-assume-unchanged <file>
ファイルが無視されているかどうかを確認する
git check-ignore
コマンドは、Gitによって無視されたファイルを報告します。
コマンドラインでファイル名を渡すことができ、 git check-ignore
は無視されるファイル名をリストします。例えば:
$ cat .gitignore
*.o
$ git check-ignore example.o Readme.md
example.o
ここでは、*。oファイルのみが.gitignoreで定義されているので、Readme.mdはgit check-ignore
出力には表示されません。
.gitignoreがファイルを無視する行を表示したい場合は、-vをgit check-ignoreコマンドに追加します。
$ git check-ignore -v example.o Readme.md
.gitignore:1:*.o example.o
Git 1.7.6以降では、無視されたファイルを表示するためにgit status --ignored
を使用することもできます。これに関する詳細は、 公式文書または.gitignoreによって無視されるファイルの検索を参照してください 。
サブフォルダ内のファイルを無視する(複数のgitignoreファイル)
次のようなリポジトリ構造があるとします。
examples/
output.log
src/
<files not shown>
output.log
README.md
examplesディレクトリのoutput.log
は有効であり、プロジェクトの理解を得るためには必要ですが、 src/
下にあるものはデバッグ中に作成され、履歴やリポジトリの一部には存在しないようにしてください。
このファイルを無視するには、2つの方法があります。 .gitignore
ファイルに作業ディレクトリのルートに絶対パスを入れることができます:
# /.gitignore
src/output.log
代わりに、 src/
ディレクトリに.gitignore
ファイルを作成し、これに関連するファイルを無視することもできます.gitignore
:
# /src/.gitignore
output.log
任意のディレクトリ内のファイルを無視する
どのディレクトリでも foo.txt
というファイルを無視するには、その名前を書きます:
foo.txt # matches all files 'foo.txt' in any directory
ツリーの一部のみでファイルを無視する場合は、 **
patternを使用して特定のディレクトリのサブディレクトリを指定することができます。
bar/**/foo.txt # matches all files 'foo.txt' in 'bar' and all subdirectories
または、 bar/
ディレクトリに.gitignore
ファイルを作成することもできます。前の例に相当するのは、ファイルbar/.gitignore
を次の内容で作成することです。
foo.txt # matches all files 'foo.txt' in any directory under bar/
ルールを無視することなくローカルでファイルを無視する
.gitignore
はファイルをローカルでは無視しますが、リポジトリにコミットされ、他のコントリビュータやユーザと共有されることを意図しています。グローバル.gitignore
を設定することはできますが、すべてのリポジトリはそれらの設定を共有します。
リポジトリ内の特定のファイルをローカルで無視し、そのファイルをリポジトリの一部にしない場合は、リポジトリ内の.git/info/exclude
編集します。
例えば:
# these files are only ignored on this repo
# these rules are not shared with anyone
# as they are personal
gtk_tests.py
gui/gtk/tests/*
localhost
pushReports.py
server/
既成の.gitignoreテンプレート
.gitignore
ファイルにどのルールをリストするかわからない場合や、一般的に受け入れられている例外をプロジェクトに追加したい場合は、 .gitignore
ファイルを選択または生成できます:
GitHubやBitBucketなどの多くのホスティングサービスは、使用しているプログラミング言語やIDEに基づいて.gitignore
ファイルを生成する機能を提供します。
ファイルへの後続の変更を無視する(削除せずに)
Gitでファイルを保持したいが、その後の変更を無視することがあります。
update-index
を使ってファイルやディレクトリの変更を無視するようにGitに指示する:
git update-index --assume-unchanged my-file.txt
上記のコマンドは、Gitにmy-file.txt
が変更されていないと仮定しmy-file.txt
変更を確認したり報告したりしないように指示します。ファイルは依然としてリポジトリに存在します。
これは、デフォルトを提供したり、ローカル環境のオーバーライドを許可するのに便利です。例:
# create a file with some values in cat <<EOF MYSQL_USER=app MYSQL_PASSWORD=FIXME_SECRET_PASSWORD EOF > .env # commit to Git git add .env git commit -m "Adding .env template" # ignore future changes to .env git update-index --assume-unchanged .env # update your password vi .env # no changes! git status
ファイルの一部だけを無視する[stub]
場合によっては、コミットまたは公開したくないファイルにローカルで変更を加えたい場合があります。理想的には、ローカル設定は.gitignore
に置くことができる別のファイルに集中する必要がありますが、時には短期的な解決策として、チェックインされたファイルにローカルなものを持たせることが役に立ちます。
Gitは、クリーンなフィルタを使ってそれらの行を "見せ"ることができます。彼らはdiffで表示されません。
ファイルfile1.c
スニペットを次のようにします。
struct settings s;
s.host = "localhost";
s.port = 5653;
s.auth = 1;
s.port = 15653; // NOCOMMIT
s.debug = 1; // NOCOMMIT
s.auth = 0; // NOCOMMIT
NOCOMMIT
行をどこにでも公開する必要はありません。
.git/config
ようなGit設定ファイルにこれを追加して "nocommit"フィルタを作成します:
[filter "nocommit"]
clean=grep -v NOCOMMIT
これを.git/info/attributes
または.gitmodules
追加(または作成)し.git/info/attributes
:
file1.c filter=nocommit
あなたのNOCOMMIT行はGitから隠されています。
警告:
- クリーンフィルタを使用すると、特にWindowsではファイルの処理が遅くなります。
- Gitが更新すると、無視された行がファイルから消えることがあります。それは汚れフィルタで打ち消すことができますが、それはよりトリッキーです。
- Windowsではテストされていない
追跡されたファイルの変更を無視する。 [スタブ]
.gitignoreと.git/info/exclude
は、追跡されていないファイルに対してのみ動作します。
追跡されたファイルに対してignoreフラグを設定するには、 update-indexコマンドを使用します 。
git update-index --skip-worktree myfile.c
これを元に戻すには、以下を使用します。
git update-index --no-skip-worktree myfile.c
この断片をグローバルgit設定に追加して、より便利なgit hide
、 git unhide
、 git hidden
コマンドを追加することができます:
[alias]
hide = update-index --skip-worktree
unhide = update-index --no-skip-worktree
hidden = "!git ls-files -v | grep ^[hsS] | cut -c 3-"
また、update-index関数で--assume-unchangedオプションを使用することもできます
git update-index --assume-unchanged <file>
変更のためにこのファイルをもう一度見たい場合は、
git update-index --no-assume-unchanged <file>
--assume-unchangedフラグが指定されている場合、ユーザはファイルを変更しないことを約束し、作業ツリーファイルがインデックスに記録されているものと一致するとGitに仮定させます。インデックスでこのファイルを変更する必要がある場合例えば、コミットでマージするとき。したがって、想定外のファイルがアップストリームで変更された場合は、手動で状況を処理する必要があります。この場合は、パフォーマンスに重点が置かれます。
--skip-worktreeフラグは、ファイルがローカルで変更され、あなたが間違って変更をコミットしたくないために特定のファイルに触れないように指示するときに便利です(つまり、特定のファイルに対して設定された設定/プロパティファイル環境)。 Skip-worktreeは、両方とも設定されている場合は、変更されていません。
既にコミットされたファイルを消去するが、.gitignoreにインクルードする
場合によってはファイルがgitによって追跡されていることがありますが、後でgitignoreに追跡を停止するために追加されました。 .gitignoreに追加する前に、そのようなファイルをクリーンアップするのを忘れるのは、非常に一般的なシナリオです。この場合、古いファイルは依然としてリポジトリにぶら下がっています。
この問題を解決するには、リポジトリ内のすべてを「ドライラン」で削除してから、すべてのファイルを元に戻すことができます。保留中の変更がなく、-- --cached
パラメータが渡されている限り、このコマンドは実行するのがかなり安全です:
# Remove everything from the index (the files will stay in the file system)
$ git rm -r --cached .
# Re-add everything (they'll be added in the current state, changes included)
$ git add .
# Commit, if anything changed. You should see only deletions
$ git commit -m 'Remove all files that are in the .gitignore'
# Update the remote
$ git push origin master
空のフォルダを作成する
Gitが空のフォルダを追加してコミットすることはできません.Gitがファイルを管理し、そのディレクトリをそれらに接続するからです。コミットが減り速度が向上します。これを回避するには、2つの方法があります。
方法1: .gitkeep
これを回避するには、Gitのために.gitkeep
ファイルを使用してフォルダを登録する方法があります。これを行うには、必要なディレクトリを作成し、フォルダに.gitkeep
ファイルを追加する.gitkeep
です。このファイルは空白で、フォルダを登録する以外の目的はありません。 Windowsでこれを行うには(ファイル命名規則が厄介です)、ディレクトリにgit bashをオープンし、次のコマンドを実行してください:
$ touch .gitkeep
このコマンドは、現在のディレクトリに空の.gitkeep
ファイルを作成するだけです
方法2: dummy.txt
もう1つのハックは上記と非常によく似ていますが、同じ手順を.gitkeep
ことができますが、 dummy.txt
代わりにdummy.txt
代わりに使用してdummy.txt
。コンテキストメニューを使用してWindowsで簡単に作成できるという利点があります。また、面白いメッセージを残すこともできます。また、 .gitkeep
ファイルを使用して空のディレクトリを追跡することもできます。 .gitkeep
は空のダイレクトイを追跡するために追加される空のファイルです。
.gitignoreによって無視されるファイルを見つける
gitで無視されるすべてのファイルを現在のディレクトリにコマンドで表示することができます:
git status --ignored
だから、このようなリポジトリ構造があれば:
.git
.gitignore
./example_1
./dir/example_2
./example_2
...と.gitignoreファイルが含まれています:
example_2
...コマンドの結果よりも:
$ git status --ignored
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
.example_1
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
dir/
example_2
ディレクトリ内で再帰的に無視されるファイルを一覧表示するには、追加のパラメータを使用する必要があります--untracked-files=all
結果は次のようになります。
$ git status --ignored --untracked-files=all
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
example_1
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
dir/example_2
example_2