Gitで未追跡のファイルやディレクトリを削除したい

FBCRailsのdevise gemを使ったプラクティスを進めています。 RailsやGemが自動生成したファイルを削除したくなる状況が度々あったので、Gitで未追跡のファイルやディレクトリを削除する方法を調べてみました。

結論

git clean コマンドを使うとgit未追跡のファイルやディレクトリを削除できる。

git cleanコマンドのオプション

git clean オプション でオプションを追加できます。

$ git clean [-n] [-f] [-i] [-d] [-q] [-e <pattern>] [-x | -X] <path>

git clean コマンドは-n-f-i いずれかのオプションを指定しないと動作しません。 ちなみに、オプション無しで動作するようにgit自体の設定で変更することもできるようです(参照: 意外と知らない? git clean のオプションについて調べた)。

  • -n, --dry-run: 削除対象のファイルを出力する。
  • -f, --force: 削除を実行する。
  • -i, --interactive: インタラクティブモードで削除処理を行う。
  • -d: 削除対象にディレクトリも含める。
  • -q, quiet: 削除されたファイルを表示しない。
  • -e <pattern>, --exclude=<pattern>: 正規表現で削除対象からファイル等を除外する。
  • -x: .gitignore に設定したファイルも削除対象に含める。
  • -X: .gitignore に設定したファイルのみ削除対象にする。

git cleanコマンドの使い方

よく使いそうな状況を想定してのgit clean コマンドの使い方です。 誤ってファイル等を削除してしまうのを防止する意味で削除実行前に-n オプションで削除対象を確認するようにした方が良さそうです(-i オプション使用時は不要)。

例1. git未追跡のファイル、ディレクトリを削除する

# 削除対象のファイル、ディレクトリを確認
$ git clean -n -d
# 削除対象のファイル、ディレクトリを削除
$ git clean -f -d

例2. インタラクティブモードでgit未追跡のファイルを削除する

コマンドを選択してファイル等の削除を行います。 今のところあまり使い道が無さそうな感じです。

# インタラクティブモードで削除を開始
$ git clean -i
Would remove the following item:
  # 削除対象のファイル、ディレクトリ名
*** Commands ***
    1: clean                2: filter by pattern
    3: select by numbers    4: ask each
    5: quit                 6: help
What now>
# コマンドの番号を入力後Enter

例3. git未追跡のファイルの中で特定のファイル以外を削除する

# 特定のファイルを除外した削除対象ファイルを確認
$ git clean -n -e ファイル
# 特定のファイルを除外した削除対象ファイルを削除
$ git clean -f -e ファイル

まとめ

Railsはgemも含めてファイルを自動生成するコマンドがたくさんあるので、誤って作成してしまったファイルはgit clean コマンドを使って削除できそうです。 また、generateコマンドが何を自動生成するのかきちんと理解して使えるようになりたいと思いました。

参照

Git - git-clean Documentation

意外と知らない? git clean のオプションについて調べた - はんなりと、ゆるやかに