結構前から考えていた、ネタがあったのだけど、まとめると時間かかりそうなので、今月はさっき思いつきで作ってみたものの紹介。
概要
gitは以前から使っていて、プライベートの開発はgithubはローカルコミットー>PUSHを何も考えずにやっているのだけど、チームでの開発だとそうもいかない。
でもPUSHしたかどうかを確認したい!
対処方法1 - コミットの差分コマンドを作成してみる。
git log origin/master..master
でリモートとローカルのコミットの差分を見ることができる。でもこれだと、マスターだけだし、長い。
そこで、現在のブランチとそれと同じリモートブランチとの差分を取得するようなコマンドを作成した。
alias gbn='git rev-parse --abbrev-ref HEAD'
function glr() {
_branch=`gbn`
git log origin/${_branch}..${_branch}
}
bash/zsh両方で動きました。
対処方法2 - ケチケチせずに、プロンプトに出してみる。
そこらに転がっているので、別にそっち使えばいいけど、bash/zsh両方対応したかったので、自分で最初から書いてみた。
(やっぱり結局最終的にはほぼ同じコードができたけどねwでも久しぶりのshellが面白かった)
今回役立ったコマンドは以下
-
git rev-parse
- ブランチ名などを渡すとそのハッシュ値を返してくれる
実は最初git show-ref
でやりくりしていたのですが、こっちのほうが整形とか簡単で使いやすかった。
zsh
通常時(またはPUSH後)
コミット時
bash
通常時(またはPUSH後)
コミット時
写真四枚使って言いたいことはアスタリスクがあるかないかってだけ・・・。
実際のコードは以下
function git_not_pushed {
# git管理下にいるかどうかの確認
if [[ "`git rev-parse --is-inside-work-tree 2>/dev/null`" = "true" ]]; then
# HEADのハッシュを取得
_head="`git rev-parse --verify -q HEAD 2>/dev/null`"
if [[ $? -eq 0 ]]; then
# origin/branch名のハッシュを取得
### gbnはブランチ名取得のalias。上に記載してある。###
_remote="`git rev-parse --verify -q origin/\`gbn\` 2>/dev/null`"
if [[ $? -eq 0 ]]; then
# 比較して、違ったら*表示。
if [[ "${_head}" = "${_remote}" ]]; then
echo -n "*"
fi
fi
fi
fi
}
zshだったら、PROMPT/RPROMPTの中でgit_not_pushedを呼ぶ。
RPROMPT='その他色々`git_not_pushed`'
bashだったら、PS1の中でgit_not_pushedを呼ぶ。
PS1='その他色々`git_not_pushed`\$ '
「その他色々」はこの話とは別なので、省略します。
一つ書き忘れたので、追記
対処方法2のコマンドですが、git fetchして、リモート側のHEADを誰かが変更していた場合、コミットしていなくても*が表示されます。対応しようとしたけど、promptへの表示のため、あまり重い処理がかけないことと、今までfetchして放置することってあんまりなかったので、別にいいかーって対応していません。