SourceTree が Git のグローバルな無視リストを書き換えて困った話

Git で git status を実行したときに、Untracked files として表示されるはずのファイルが表示されない現象に出会った。

いろいろ調べてみたところ、SourceTree さんがインストール時にグローバルな無視リストを作成していたことが判明した。SourceTree を使ってないときにも影響がでるのでたちが悪い。

勝手に書き換えられてしまうファイルはこれだ!!

Windows 版の例だけど、まず、.gitconfig に次のような設定が追加されちゃう。

[core]
    excludesfile = C:\\Users\\username\\Documents\\gitignore_global.txt

Mac の場合は /User/username/.gitignore_global に設定する模様。

gitignore_global.txt はこんな感じになってた。

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
*.dll
*.lib
*.sbr

この辺の拡張子は、Windows 関係の開発で自動生成されたり、中間ファイルだったりするファイルなので、確かにコミットする必要がないことはない。

.gitconfig に excludesfile がないときに発動

セットアップ時に、最初のダイアログには [Allow SourceTree to modify global Git and Mercurial config files] という設定項目がある。

デフォルトでチェック入ってるんだけど、これが入ってる以上は、.gitconfig がいじられても文句は言えない。

デフォルトのままで先に進むと、.gitconfigexcludesfile の設定がない場合には SourceTree さんは上に書いたような書き換えを行ってくれる。

シンセツダナー。

この親切すぎて涙がでてしまう挙動は、当然のように一部のユーザーの逆鱗に触れることとなり、非難轟々、雨嵐霰がふき乱れた。

「最低なやつめ! なんで gitignore_global.txt を勝手に作って .dll と .exe を除外しちゃうんだよ!?」というユーザーのお怒りの声。

これに対して、「怒らせてごめんよ。すでにグローバルな ignore ファイルがあればそんなことはしないよ。」と答える SourceTree さん。

「git に不慣れな人を助けるために、グローバルな ignore ファイルがないならそうしてるんだよ。だって、exe や dll をコミットすることなんてめったにないでしょ?」。まぁ、それはそうなんだけども・・・。

「次のリリースでは、もうちょっと注意を引きやすい警告を出すようにして、バイナリー ファイルをコミットしたい人を困らせないようにするよ」と、将来のバージョン アップを誓っている。

最近は警告ダイアログをだしてくれる

で、その結果、最近のリリースでは、こんなダイアログが表示されるようになった。

ざっと訳すと

グローバルな ignore ファイルがないようだけど、SourceTree がデフォルトのやつを設定したげようか?

.exe とか .dll とか .obj とか .suo とか Debug のようなフォルダーとか、普通はソース管理しないようなやつを追加しといてあげるよ。

もし、デフォルトで全部のファイルをみれるようにしたいなら、とりあえず No を選んどいてね。あとで、Tools > Options から設定することもできるよ。

と書いてある。

次のキャプチャーを見る限りは Mac 版でも「グローバル無視リスト」を書き換える処理はあるようだ。

(画像は kashew_nuts-tech: Mac用Git/MercurialのGUIクライアント-SourceTree-を試してみた より)

まとめ

SourceTree の Windows 版を試した人 (特に初期のバージョン) は、マイドキュメント直下に gitignore_global.txt がないか確認しておくとよいだろう。このファイルが残っていると、Git を使っていて無駄に混乱してしまうかもしれない。分かってて設定する分にはいいんだけども。