2014年11月9日日曜日

sshfs では重い git を快適にする gitconfig

開発サーバーなどへ sshfs して作業すると sshfs 越しの git コマンドがもっさりと重たい事があります。もし、直接 ssh した上でのレスポンスが悪いわけでなければ、sshfs 越しに git を叩きたいクライアント側の ~/.gitconfig で次のような設定を施すと快適度が改善されます。

1. 要点簡易手抜き版


[alias]
  servername = "!f(){ ssh -t servername \"cd respo-path && git $@\"; }; f"

~/.ssh/config で servername で接続される設定を施していない場合には ssh へのコマンドラインなど適当にアレンジします。ssh コマンドオプションの -t は色付けのためだけでも付けておくと目に便利。

設定後は、

git checkout some-branch

とするところで、

git servername checkout some-branch

とすると、よしなに sshfs ではなく ssh で動作するようになり、 sshfs 経由で git が重い場合でも快適に git をシームレスに使用できるようになります。

注意点として、この簡略なgitエイリアス内のシェル操作では ssh 先のサーバー側のリポジトリーパスを決め打ちしているので、良くも悪くもリポジトリーのトップディレクトリーで git コマンドを打った挙動になります。diffやcheckoutでファイル名を扱う場合にはこの簡易的なシェル操作のバージョンでは少々それについて意識しておく必要があります。

2. 作業中の相対ディレクトリーに対応してそれっぽくした版


git() { GIT_PREFIX='$(git rev-parse --show-prefix)' env git $@; }

先ず、.zshrc 等で git にシェル関数を定義しておきます。このシェル関数で git 実行中は GIT_PREFIX で実行直前の git の作業中の相対ディレクトリーを参照できる状態になります。

その上で、 ~/.gitconfig は以下のように修正します。

[alias]
  servername  = "!f(){\
      SERVER=servename;\
      GIT_REPOS=repos-path;\
      echo \" === ssh ${SERVER}:${GIT_REPOS}/${GIT_PREFIX} git === \";\
      ssh -t houti2 \"cd ${GIT_REPOS}/${GIT_PREFIX} && git $@\";\
    };f"

相対パス対応の本質は単に cd で ${GIT_REPOS}/${GIT_PREFIX} で作業ディレクトリーを変更しているだけです。

.gitconfig の [alias] の中では既に git が実行されている最中で、この時の作業ディレクトリーは既に git リポジトリーのルートディレクトリーになっているので、ここで git rev-parse --show-prefix しても目的のディレクトリーは得られません。そこで、事前に git コマンドにシェル関数で git 実行時には直前に予め作業ディレクトリーをシェル変数へ保持するように工夫します。

0 件のコメント:

コメントを投稿