2012-03-23 13:01:51 via web to @sugyan
@Cside_ ありがとうございます、やっぱりそんな感じですかねー!
2012-03-23 14:06:12 via Twitter for Mac to @Cside_
@sugyan もしzshでならこんな感じでできます. URL
2012-03-23 14:16:21 via YoruFukurou to @sugyan
@yaotti ありがとうございます、vcs_infoは便利ですよねー。シェルスクリプト内で判定つかいたいなーと思ったのですが、vcs_infoの中ではgit rev-parse --git-dir 2> /dev/null で判定しているっぽいですね〜
2012-03-23 14:21:59 via Twitter for Mac to @yaotti
@sugyan おーそうみたいですね. > VCS_INFO_detect_git
2012-03-23 14:27:00 via YoruFukurou to @sugyan
zsh / Code / [5e4db6]
このへん。
if VCS_INFO_check_com ${vcs_comm[cmd]} && ${vcs_comm[cmd]} rev-parse --is-inside-work-tree &> /dev/null ; then ...
という具合に判定されている。
Determine if directory is under git control - Stack Overflow
こちらでもgit rev-parse
のリターンコードを見るのが良い、というようなことが書いてある。
ということでシェルスクリプト的には
if git rev-parse 2> /dev/null; then echo true; else echo false; fi
という感じで判定するのが良さそう。gitリポジトリ下でない場合は標準エラー出力にメッセージが出るので要らないなら捨てる。
蛇足
git rev-parse
コマンドは"--is-inside-work-tree"オプションで".gitディレクトリ内にいるか否か"の判定ができるので便利。
$ git rev-parse fatal: Not a git repository (or any of the parent directories): .git $ git init Initialized empty Git repository in /path/to/.git/ $ git rev-parse --is-inside-work-tree true $ cd .git $ git rev-parse --is-inside-work-tree false
蛇足その2
結局コレって副作用の無いgitコマンドを実行して、gitリポジトリ下じゃない場合にエラー吐いて死ぬか否かを判定する、ってことなのでgit rev-parse
じゃなくても問題はないわけで例えばgit status
とかでも良いのですよね。
gitリポジトリ下か否かの判定は、主にsetup_git_directory_gently_1関数で行われている模様。ここで"正しい.gitディレクトリ"があるかどうかを見ているようだ。大抵はsetup_git_directory()
関数が呼ばれたときに内部でこの判定を行い、正しい.gitディレクトリが見つからなかったときにエラーを吐いて死ぬようになっているようだ。builtin command群ではRUN_SETUP
フラグがオプションに定義されているとコマンド本体に処理が渡る前にそれが呼ばれる。
git/git.c at v1.7.9.4 · gitster/git · GitHub
ので、commandsで定義されているbuiltin commandたちのうちRUN_SETUP
が含まれているものはgitリポジトリ下じゃない場合にだいたいエラー吐いて死ぬはず。
$ git blame fatal: Not a git repository (or any of the parent directories): .git $ git gc fatal: Not a git repository (or any of the parent directories): .git $ git log fatal: Not a git repository (or any of the parent directories): .git $ git status fatal: Not a git repository (or any of the parent directories): .git $ git tag fatal: Not a git repository (or any of the parent directories): .git
なのでこのへんのコマンドも判定に使えることは使える、と思う。
ちなみにgit rev-parse
はRUN_SETUP
フラグは立っていなくて、処理の本体となるcmd_rev_parse
内でsetup_git_directory()
を呼んで判定を行っているようだ。
git/rev-parse.c at v1.7.9.4 · gitster/git · GitHub
builtin command本体まで処理が届いているか否かはTRACEを見てみると分かる。
$ GIT_TRACE=1 git status fatal: Not a git repository (or any of the parent directories): .git $ GIT_TRACE=1 git rev-parse trace: built-in: git 'rev-parse' fatal: Not a git repository (or any of the parent directories): .git
だから何だ、って話だけど…