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があるとき、
/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があり、
*
下記のように配置されている場合、
+.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ディレクトリも全部消えてしまう。