Edited at

gitのサブコマンドで.gitディレクトリのあるパスまで戻りたかったけど無理だった話

More than 3 years have passed since last update.


背景

ただ、弊社であったり自分でAnsible書くときはだいたいGit管理するので、そのルートに移動できればいいんじゃないかと思いました。


試作

~/.gitconfig[alias] にはだいたいこんな感じで内容を書くと思います。


.gitconfig

[alias]

co = checkout
ci = commit
st = status
br = branch

実はここで、こういう風に書くとシェルスクリプトの内容が実行できます。


.gitconfig

[alias]

echo = "!echo 'hello world'"

これを使って、cdさせればいいんじゃないかと思った次第です。


設定案

いずれも、git top と打ったときにgitconfigのあるディレクトリへカレントを移動させることを想定しています。

結果的にいうと、いずれもだめでした。


設定案1


.gitconfig

  top = "!f() { export TOPDIR=$(git rev-parse --show-toplevel); }; f; cd ${TOPDIR};"



設定案2


.gitconfig

  top = "!f() { TOPDIR=$(git rev-parse --show-toplevel);  cd ${TOPDIR};}; f"



設定案3

PATHの通ったディレクトリに以下のファイルを置く。実行権限もつけておく。


git-top

cd $(git rev-parse --show-toplevel)



理由の考察

どうやら、サブシェルで実行されているようです。

コマンド発行→サブシェルに潜る→サブシェル内でカレント移動→元のシェルに戻る(元のカレントのまま)


緩和策

.bashrcに以下の内容を記載して、 source ~/.bashrc


.bashrc

alias gitroot='cd `(git rev-parse --show-toplevel)`'


他にもやり方はいろいろあると思いますが、一番手を抜いた方法ですね。

関数作ったりでも良いと思います。


まとめ

残念でした。