#本文
これのエイリアス版。.gitconfig
の[alias]
以下にそのままコピペすれば動くはず。
[alias]
pull-o = "!f(){ \
local branch_name=${1};\
local current_branch=$(git symbolic-ref --short HEAD);\
local branch_remote=$(git config branch.${branch_name}.remote);\
local branch_path=$(git config branch.${branch_name}.merge);\
if [ ${branch_name} = ${current_branch} ];then \
git pull ${branch_remote} ${branch_name} --ff-only;\
return ${?};\
else \
git fetch ${branch_remote} && \
git fetch . refs/remotes/${branch_remote}/${branch_name}:${branch_path};\
return ${?};\
fi;\
};f"
引数を扱うため関数としてaliasに登録する。使い方はgit pull-o <ブランチ名>
。HEAD
の位置によらずorigin
の指定ブランチをpull
するので、定期的にスクリプト等で実行したい場合に便利……かもしれない。
なお、ファストフォワード不可能な場合などはちゃんと失敗する。
#解説
「checkoutせずに特定ブランチをpullする」で書いたように、git fetch . origin/<ブランチ名>:<ブランチ名>
はHEADの位置と指定のブランチが一致していると失敗する。その場合は通常のpull
をすれば良いのだが、どうせエイリアスにするならということで一致した場合の対策も入れた。
git symbolic-ref --short HEAD
はHEADのブランチ名を返すため、指定したブランチと比較して分岐し、等しい場合は通常のgit pull
を実行する。git pull --ff-only
にしたのは念のため。
ブランチ名が等しくない(HEADの位置と異なる)場合は以前の記事と同等のことをしている。ただしgit fetch origin
に失敗した場合はfetch . (略)
を実行させたくないため、ここだけは;
ではなく&&
で接続しておく。あと折角なのでrefs/remotes/${branch_remote}/${branch_name}:refs/heads/${branch_name}
とパスを全て書いた。別に書かなくても動く。
return ${?}
で直前の実行コマンドの戻り値をそのまま返しているので、このalias自体をシェルスクリプトや&&
, ||
で繋ぐことが可能。
#更新履歴
しれっとアップデートしている。remote
の名前とパスをgit config
から引っ張ってきたり、変数宣言をlocal
にしたり。