February 8, 2017

`git push -u` で消耗しないために

Categories: 技術 | Tags: #Git #Alias


毎回、ローカルで作業していたブランチを、

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

めでたしめでたし。


written by sgr-ksmt