ローカルのブランチのコミットをリモートに反映するとき
$ git push origin [ブランチ名]
とかってやりますよね。この origin [ブランチ名]
の指定って正直面倒くさいです。
基本同じ名前のブランチにPUSHしますし、ブランチ名がある程度長くなってくるともう...
それだからといって、新しいブランチを作るごとに
git push -u origin [ブランチ名]
で設定するのも面倒くさい。(参考)uオプションによるデフォルト設定
違うリモート先にPUSHするときは結局指定してやらないといけなくなります。
ならば、git push コマンドの挙動を変えてやりましょう。
想定する使い方
- pushによって反映するリモート先は選択できるようにしたいので、リモートの名前を引数に取ります。
- 第2引数を指定しなければ、カレントブランチと同名ブランチにpushします。
# originのカレントブランチと同名のブランチにpush
$ gipush origin
# originのnew_branchブランチにpush
$ gipush origin new_branch
- また、pushを実行する前にpush先を以下のような形で最終確認できるようにします。
origin/develop にpushしてよろしいですか? (y/n) :
bashのalias作成
ソース
~/.bashrc
で git push のaliasを作成します。
function gipush {
if [ ! $1 ]; then
echo '[error] PUSHするリモート先を指定してください';
return;
fi
branch_name=${2:-$(git symbolic-ref --short HEAD)}
read -p "${1}/ ${branch_name} にpushしてよろしいですか? (y/n/f) :" YN
if [ "${YN}" = "y" ]; then
git push $1 $branch_name
elif [ "${YN}" = "f" ]; then
git push --force-with-lease $1 $branch_name
fi
}
alias gipush=gipush
解説
今回の場合、引数によって処理を加えたいので関数として定義します。
そしてその関数をaliasとして設定しておけば、そのコマンドで実行することができます。
コマンドラインで指定した引数は、$1
, $2
という形で順に取得します。
まず、第一引数のpush先のリモート名がなければ、エラーを出し無効とします。
次に、第二引数の有無によってpush先ブランチを決定しています。
branch_name=${2:-$(git symbolic-ref --short HEAD)}
git symbolic-ref --short HEAD
で現在のカレントブランチが出力されるので
引数があればそちらを、なければカレントブランチでという指定になります。
この時push先を最終確認したいのでメッセージを表示し、
read
によって対話的な処理を行い分岐させています。
今回、普通の git push
以外にrebaseした際などに
使う --force-with-lease
オプションも使いたかったのでこのような分岐にしています。
余談
カレントブランチ名を取得して...とやっていますが
ただリモートのカレントブランチにpushしたい場合は以下で問題ないようです。
(yamap_55 さん、ありがとうございます。)
$ git push origin HEAD
終わりに
普段シェルスクリプトを書かないので、ORの指定の仕方など勉強になりました。
elif
なのが一番びっくりしました。rubyでも elsif
なのに...
今回は、git push
の挙動を変えるという方針で行きましたが
後から考えてみれば、git branchで作った際に、 -u
で設定するって感じでもよかったですね..
今回のスクリプト別にいらないんじゃない感が残りますが、
最終確認のダイアログが欲しかったので、これでよしとします。