偽git.exeを作ってTortoiseGitの挙動を観察しよう
TortoiseGitでローカルで間違って消してしまったファイルを復元したいと考えた。
いろいろ試した結果、 TortoiseGit revert すれば治ることがわかったけど、これで正しいやり方なの?って疑問があったのでtwitterで聞いてみたら、
と、教えてもらえた。
git revert はコミットしたものをなかった事にするコマンドらしい。
http://drag0n.fam.cx/?p=399
こーゆー場合は、 git checkout とかのコマンドを使うのが正しいらしい。
ぢゃあなんで、これで TortoiseGit でファイルが巻き戻ったか、、、
そもそも TortoiseGit には、checkout なんていうメニューはないし、、、困った。
そこで、実際に TortoiseGit が、どういうコマンドを発行しているかを調べることにした。
TortoiseGit は、 git.exe を呼び出して git にアクセスしている。
つまり、偽の git.exe を作って、そこでログを取ることで挙動を観察できる。
httpでいう proxy とかで挙動を観察するアレだ。
とりあえずこーゆー batファイルをgit.batという名前で作ってみた。
@echo off echo "git %1 %2 %3 %4 %5 %6 %7 %8" >> c:\log.txt PATH=%PATH%;C:\msysgit\msysgit\mingw\bin;C:\msysgit\msysgit\lib C:\msysgit\msysgit\bin\git.exe %1 %2 %3 %4 %5 %6 %7 %8
これで入力されたコマンドのログが取れる。
ただ、 TortoiseGit は、 "git.exe" を呼び出すように作られているので、 git.bat を実行させることはできない。
そこで、 batファイルを exe に変換するツールを使って、 git.bat を git.exe に変換してみた。
Bat_To_Exe_Converter
http://freesoftbangai.blog50.fc2.com/blog-entry-42.html
これで、偽のgit.exeができた。
あとは、 TortoiseGitの General の MSysGit に偽のgit.exeがあるパスを書くだけだ。
で、その結果できたログがこれ。
"git rev-parse --revs-only HEAD " "git diff-index --raw HEAD --numstat -C -M -z --" "git diff-index --cached --raw HEAD --numstat -C -M -z" "git rev-parse --revs-only HEAD " "git ls-files -u -t -z -- " "git checkout HEAD -f -- jquery.ui.tooltip2.js " "git checkout HEAD -f -- jquery.ui.tooltip2.min.js "
最後の2行が TortoiseGit で revert をコマンドを実行したところだ。
2つのファイルを巻き戻しているのでこれで正しい。
"git checkout HEAD -f -- jquery.ui.tooltip2.js " "git checkout HEAD -f -- jquery.ui.tooltip2.min.js "
と、ふつーに git checkout で戻していましたとさ。
なんつーか、余計分かりづらいよーなw。
つまり、まとめると、間違ってローカルでファイルを消してしまった場合は、git checkout する。しかし、tortoiseGitの場合は revertを選択する。そうすれば 内部ではgit checkoutが発行され復元されるってことですね。
助言を頂いた @kikairoya さんと、 @bleis さん、ありがとうございました。