毎回、ローカルで作業していたブランチを、
git push -u origin feature/hoge
みたいに書いていたのですが、これがものすごくだるいと思ったので、
git pucb
だけで済むようにしてみました。
最初に考えたもの
こんな感じで .gitconfigに書いてみました。
# .gitconfig
[alias]
pucb = !git push -u origin $(git symbolic-ref --short HEAD)
まず、現在のブランチ名を取得するには、 symbolic-ref コマンドを使ってHEADを参照してあげると簡単に取得することができます。
あとはこれを、 pushコマンドの引数として現在のブランチ名を渡しつつ、 -u オプションを付けてあげます。
しかし、これだと -u付けなくて良い場合(1回やった後)でも -u つけて実行してしまうので、
良い方法は無いものか、、とstack over flowに飛び込んでみました。
より良い方法を求めて
そしてStackOverFlowのこちらの回答に辿り着きました。
以下、抜粋してきたものになります。どうやらこれで、 git push -u {ブランチ名} をすべきなのか、 git push だけで良いのかを見ているようです。
# 見やすくするために途中で(\)を使って改行しています
![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && \
git push -u origin $(git symbolic-ref --short HEAD) || git push
$(git config "branch.$(git symbolic-ref --short HEAD).merge")
の部分で、そのブランチがremoteに存在しているか見ているようです。
remoteに存在していてtrackingしている場合は、 refs/feature/hoge みたいに文字列が返ってきます。
その判定でもしtrackingされていない(=空文字)の場合には、
git push -u origin $(git symbolic-ref --short HEAD)
を実行して、そうでなければ git push を実行するように組まれています。
最終的に
StackOverFlowのこちらの回答を基に、自分は pucbというエイリアス名で登録しました。
(push -u current branchを縮めたものです)
# .gitconfig
[alias]
pucb = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push
g pucb
めでたしめでたし。