git clean
このセクションでは、git clean コマンドについて詳しく取り上げます。Git clean はある程度「元に戻す」コマンドと似ています。git clean は git reset や git checkout など他のコマンドに足りない部分を補完するものだと考えることができます。これらその他のコマンドでは、以前 Git トラッキング・インデックスに追加されたファイルを操作しますが、git clean コマンドは追跡対象外ファイルを操作します。追跡対象外ファイルとはリポジトリの作業ディレクトリ内で作成されたものの、git add コマンドを使ってリポジトリのトラッキング・インデックスにまだ追加されていないファイルのことです。
追跡対象ファイルと追跡対象外ファイルの違いをよりわかりやすく説明するために、以下のコマンド ライン サンプルを見てみてください。
1$ mkdir git_clean_test
2$ cd git_clean_test/
3$ git init .
4Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/
5$ echo "tracked" > ./tracked_file
6$ git add ./tracked_file
7$ echo "untracked" > ./untracked_file
8$ mkdir ./untracked_dir && touch ./untracked_dir/file
9$ git status
10On branch master
11
12Initial commit
13
14Changes to be committed: (use "git rm --cached <file>..." to unstage)
15
16new file: tracked_file
17
18Untracked files: (use "git add <file>..." to include in what will be committed) untracked_dir/ untracked_fileこのサンプルでは、git_clean_test ディレクトリに新しい Git リポジトリを作成しています。その後、Git インデックスに追加される tracked_file、untracked_file と untracked_dir の順に作成されます。次に、git status を呼び出して追跡対象の変更と追跡対象外の変更の Git の内部状態を示す出力を表示しています。この状態のリポジトリで、git clean コマンドを実行すると、このコマンドの本来の目的を実際に確認できます。
1$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to cleanこの時点で、デフォルトの git clean コマンドを実行すると致命的なエラーが発生することがあります。上のサンプルはそのエラーがどのように表示されるかを示しています。Git は「force」オプションを渡さないと git clean を開始できないようデフォルトでグローバルに設定されています。これは重要な安全策です。最終的に git clean を実行すると、元の状態には戻せません。エラーが発生せずに git clean が実行されると、ファイル システムの削除が確定します。つまり、コマンド ラインの rm ユーティリティを実行したときと同じような結果になります。コマンドを実行する前に、追跡対象外ファイルを削除しても本当に問題ないか確認してください。
一般的なオプションとその使用方法
git clean のデフォルトの動作と注意事項はさきほど説明したとおりですが、ここからは git clean のさまざまなユース ケースと、操作に必要なコマンド ライン オプションを説明します。
1-n-n オプションでは git clean の「ドライ ラン」を実行します。このオプションを付けることで、実際に削除する前に削除対象のファイルを確認できます。ファイルを削除するときは必ず git clean のドライ ランを実行することをお勧めします。さきほど作成したデモ用リポジトリで、このオプションの実際の動作を確認できます。
1$ git clean -n
2Would remove untracked_file出力を見ると、git clean 実行時に untracked_file が削除されることがわかります。この出力では untracked_dir が報告されていないことに注目してください。デフォルトでは git clean はディレクトリで再帰的な操作を実行しません。これも、誤って完全に削除するのを防止する安全策の 1 つです。
1-f or --forceforce オプションを追加すると、現在のディレクトリの追跡対象外ファイルの削除が実際に始まります。clean.requireForce 設定オプションを false に設定していない限り、force オプションを付ける必要があります。.gitignore で指定した、追跡対象外のフォルダーまたはファイルは削除されません。では実際にサンプル リポジトリで git clean を実行してみましょう。
1$ git clean -f
2Removing untracked_fileこのコマンドは、削除されたファイルを出力します。出力を見ると、untracked_file が削除されていることがわかります。この時点で git status か ls を実行すると、untracked_file が削除されていてどこにもないことがわかります。デフォルトでは、現在のディレクトリのすべての追跡対象外ファイルが git clean -f の対象になります。また、<path> の値を -f オプションとともに渡して特定のファイルを削除できます。
1git clean -f <path>
2-d include directories-d オプションは、git clean に追跡対象外のディレクトリを削除するように指示します。デフォルトでは、それによりディレクトリは無視されます。前のサンプルに -d オプションを追加できます。
1$ git clean -dn
2Would remove untracked_dir/
3$ git clean -df
4Removing untracked_dir/ここでは、-dn の組み合わせを使用して「ドライ ラン」を実行し、その結果 untracked_dir は削除されます。その後、強制クリーンを実行し、untracked_dir が削除されたという出力を受け取ります。
1-x force removal of ignored files一般的なソフトウェア リリースのパターンには、リポジトリのトラッキング インデックスにコミットされないビルド ディレクトリまたは配布ディレクトリがあります。ビルド ディレクトリには、コミットされたソース コードから生成された一時的なビルドの中間生成物が格納されます。通常、このビルド ディレクトリはリポジトリの .gitignore ファイルにです。追跡対象外の他のファイルがあるこのディレクトリを整理しておくと便利です。-x オプションを git clean に付けると、無視されたファイルも含めるよう指定できます。以前の git clean 呼び出しのように、最終的に削除する前にまずは「ドライ ラン」を実行しておくことをお勧めします。-x オプションは、プロジェクト ビルド固有のファイルだけでなく、無視されているすべてのファイルを対象にします。例えば、./.idea IDE 構成ファイルのような想定外のファイルです。
1git clean -xf-d オプション同様、-x を渡して他のオプションと組み合わせられます。このサンプルでは -f と組み合わせて、現在のディレクトリの追跡対象外ファイルだけでなく、Git では通常無視されるすべてのファイルも削除します。
インタラクティブモードまたは git clean のインタラクティブ操作
これまでに説明してきたアドホック コマンド ライン実行に加えて、git clean には、-i オプションを渡すことで開始できる「インタラクティブ」モードがあります。このドキュメントの紹介から、リポジトリのサンプルを見てみましょう。この初期状態から、インタラクティブ クリーン セッションを開始します。
1$ git clean -di
2Would remove the following items:
3 untracked_dir/ untracked_file
4*** Commands ***
5 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
6What now>-d オプションを使用してインタラクティブ セッションを開始したので、untracked_dir にも影響を与えます。インタラクティブ モードでは、追跡対象外のファイルに適用するコマンドを要求する What now> プロンプトが表示されます。コマンドは改めて説明するまでもないでしょう。コマンド 6: help で始まるものからランダムな順序でそれぞれを簡単に見ていきましょう。コマンド 6 を選択すると、他のコマンドについての説明にもなります。
1What now> 6
2clean - start cleaning
3filter by pattern - exclude items from deletion
4select by numbers - select items to be deleted by numbers
5ask each - confirm each deletion (like "rm -i")
6quit - stop cleaning
7help - this screen
8? - help for prompt selection15: quitこれは非常にシンプルであり、インタラクティブ セッションを終了します。
11: clean指定された項目を削除します。この時点で 1: clean を実行すると、untracked_dir/ untracked_file は削除されます。
14: ask each追跡対象外のファイルを反復処理し、削除用の Y/N プロンプトを表示します。以下のようになります。
1*** Commands ***
2 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
3What now> 4
4Remove untracked_dir/ [y/N]? N
5Remove untracked_file [y/N]? N12: filter by pattern追跡対象外のファイルのリストをフィルタリングするために使用される入力を受け取る追加のプロンプトを表示します。
1Would remove the following items:
2 untracked_dir/ untracked_file
3*** Commands ***
4 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
5What now> 2
6 untracked_dir/ untracked_file
7Input ignore patterns>> *_file
8 untracked_dir/ここでは、*_file というワイルドカード パターンを入力し、追跡対象外ファイル リストを untracked_dir に制限します。
13: select by numbersコマンド 2 と同様に、コマンド 3 は追跡対象外ファイル名のリストを絞り込めます。インタラクティブ セッションでは、追跡対象外のファイル名に対応する番号を入力するように求められます。
1Would remove the following items:
2 untracked_dir/ untracked_file
3*** Commands ***
4 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
5What now> 3
6 1: untracked_dir/ 2: untracked_file
7Select items to delete>> 2
8 1: untracked_dir/ * 2: untracked_file
9Select items to delete>>
10Would remove the following item:
11 untracked_file
12*** Commands ***
13 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help要約
要約すると、git clean はリポジトリの作業ディレクトリにある追跡対象外ファイルを削除する際に便利な方法です。追跡対象外ファイルとはリポジトリのディレクトリにあるものの、git add を実行してリポジトリのインデックスにまだ追加されていないファイルのことです。全体的に見ると、git clean の代わりに git status とオペレーティング・システムに元々ある削除ツールを使っても同じ結果が得られます。git clean は git reset と併用して、リポジトリのあらゆる追加とコミットを元に戻せます。