背景
ansibleの構成ファイルいじってるときに、ansibleファイル群のルートディレクトリに一発移動できるコマンドほしい感じがした。
— NPoi(平均身長野郎) (@NPoi) 2016年4月21日
ただ、弊社であったり自分で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)`'
他にもやり方はいろいろあると思いますが、一番手を抜いた方法ですね。
関数作ったりでも良いと思います。
まとめ
残念でした。