git push の引数指定が面倒。デフォルト設定スクリプトを書いてみた

ローカルのブランチのコミットをリモートに反映するとき

$ 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 で設定するって感じでもよかったですね..

今回のスクリプト別にいらないんじゃない感が残りますが、

最終確認のダイアログが欲しかったので、これでよしとします。:innocent:

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.