LoginSignup
6
5

More than 1 year has passed since last update.

Git管理外のgitignoreで除外されたファイルは-x指定なしのcleanでも削除される

Last updated at Posted at 2017-03-15

2022/7/10訂正

未コミットの.gitignoreでも -fd オプションの対象になる挙動をするという旨をコメントでご指摘いただきました。
私も手元で試してみたのですが、指摘の通りの挙動でした。
ということで、この記事の内容は古いバージョンでのみ適用される話か、あるいは私の記憶違いであるようです。

TL;DR

Gitで管理していない.gitignoreによって除外されたファイルは、 -x 指定なしの git clean によって削除される。
例えば、以下のルートディレクトリでgit clean -fd(※git clean -fdxではない)を実行するとlocalディレクトも消えてしまう。

+.git
+src/
  +[ここにたくさんのファイル]
  +local/
    + *.gitignore (※自身を含め、ディレクトリ内すべて無視するように記述)
    + *foo.md
    + *bar.md
     [ローカル環境で保持するけどgit管理しないファイル群]

前置き

git cleanはgitで追跡していないファイルを削除するコマンドである。
ただし、通常、-xオプションを付けない限り、.gitignoreで除外されたファイルを削除することはない。

例えば、このような.gitignoreがあるとき、

.gitignore
/sample/foo.md

このルートディレクトリで、git clean -fdを実行すると(※以下、*の付いたファイルは未コミットを示す)、

+.git
+.gitgnore
+sample/
  + *foo.md
  + *bar.md

このように、sample/bar.mdだけが削除される。

+.git
+.gitgnore
+sample/
  + *foo.md

なお、このsample/foo.mdのように.gitignoreで除外されているファイルを削除するには、git clean -fdxを実行する。
実行後はこうなる。

+.git
+.gitgnore

本編

ところが、このような未コミットの.gitignoreがあり、

.gitignore
*

下記のように配置されている場合、

+.git
+sample.md
+tmp/
  + *.gitignore
  + *foo.md
  + *bar.md

このルートディレクトリで、git clean -fdを実行すると、

+.git
+sample.md

このように、未コミットの.gitignoreによって除外されたファイルも削除される。

まとめ

  • git clean-xを付けない場合に、.gitignoreで除外されたファイルは削除しない。
  • ただし、この場合の.gitignoreはコミットされた(gitで管理された)ものである必要がある。
  • つまり、-xオプションなしでも、git管理されていない.gitignoreで除外されたファイルは削除される。

補足

これがどんな問題になるのは次のようなケース。
以下のようにローカルでGit管理しないファイルを保持している場合に、

+.git
+src/
  +[ここにたくさんのファイル]
  +local/
    + *.gitignore
    + *foo.md
    + *bar.md
     [ローカル環境で保持するけどgit管理しないファイル群]

うっかり、git clean -fdを実行すると、localディレクトリも全部消えてしまう。

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5