サーチ…


前書き

このトピックでは、不要なファイル(またはファイルの変更)をGitリポジトリに追加しないようにする方法について説明します。いくつかの方法(グローバルまたはローカルの.gitignore.git/excludegit update-index --assume-unchanged 、およびgit update-index --skip-tree )がありますが、Gitはコンテンツを管理しています。無視すると、実際にはフォルダの内容 (ファイルなど)は無視されます。とにかく追加できないので、空のフォルダはデフォルトでは無視されます。

.gitignoreファイルでファイルとディレクトリを無視する

あなたのリポジトリに1つ以上の.gitignoreファイルを作成することで、Gitが特定のファイルとディレクトリを無視するようにすることができます。

ソフトウェアプロジェクトでは、 .gitignoreは通常、ビルドプロセス中または実行時に生成されるファイルやディレクトリのリストが含まれています。 .gitignoreファイルのエントリには、 .gitignore指す名前またはパスが含まれます。

  1. キャッシュ、ログファイル、コンパイル済みコードなどの一時的なリソース
  2. 他の開発者と共有してはならないローカル構成ファイル
  3. ログインパスワード、鍵、資格情報などの秘密情報を含むファイル

最上位ディレクトリに作成すると、ルールはリポジトリ全体のすべてのファイルとサブディレクトリに再帰的に適用されます。サブディレクトリに作成すると、その特定のディレクトリとそのサブディレクトリにルールが適用されます。

ファイルまたはディレクトリを無視すると、次のようになりません。

  1. Gitによって追跡される
  2. git statusgit diffなどのコマンドによって報告される
  3. 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ファイルを生成する機能を提供します。

GitHub .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は、追跡されていないファイルに対してのみ動作します。

追跡されたファイルに対してigno​​reフラグを設定するには、 update-indexコマンドを使用します

git update-index --skip-worktree myfile.c

これを元に戻すには、以下を使用します。

git update-index --no-skip-worktree myfile.c

この断片をグローバルgit設定に追加して、より便利なgit hidegit unhidegit 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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow