読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

git stash -u が .gitignore のファイルを削除する

git stash -u と bundler

git stash には、untrackedなファイルをまとめて退避する、 -u | --include-untracked オプションがある。 新しくファイルを作ったがまだコミットしてない時に、git stash -u をよくする。 便利だ。 問題はbundlerを使うRubyプロジェクトで、git stash -u すると、bundle installが初めからインストールを始める 不便だ。

原因を調べてみると、.gitignore/vendor/bundle があるにも関わらず、 git stash -u すると vendor ごとディレクトリが消える。 そして git stash pop しても、消えた vendor は悲しいことに復活しない。

git の問題か

git側が原因であるのはわかったが、正しい振る舞いかそれともバグなのか判断できない。 git stash -u で .gitignore のファイルを削除する問題、以下の記事でも取り上げられていた。

http://blog.icefusion.co.uk/git-stash-can-delete-ignored-files-git-stash-u/

この記事曰く、git stash -u で退避した直後、 git clean -d を実行している。 つまり git clean -d すると .gitignore にあるファイルまで消されてしまう。 同様の議論がすでにMLでも行われている。

既知の問題ではあるが、それでもバグかどうかはわからない。

対策

/vendor/.keepを作成してGitのリポジトリに追加すれば、git stash -ugit clean -dvendorが削除されることはない。 それにしても、.gitignoreに書かれたファイルが消えるのは予期せぬ動作だが、リポジトリへの変更があるときのみファイルが消えるのも解せない。 そして git stash pop しても退避前の状態が復元されないのも、意図しない動作のようにも思える。 これはやはりバグではないのか、自分はGitに詳しくないので、これ以上判断ができない。