偽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 さん、ありがとうございました。