毎回、ローカルで作業していたブランチを、
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
めでたしめでたし。