はじめに
gitでバージョン管理をしている
GUIの操作を覚えたくないのでCLIでやろうとするが長くなりがちなブランチ名をいちいちコピペするのもめんどくさい
というところで、ブランチの移動とやりたいときはマージまでコマンドで簡単にできないかとシェルスクリプトを作成した。
これでブランチの移動にストレスがなくなりました
./bashrc
への追加でさらに使いやすくなります
何か意見改善点あればぜひ教えてください!!
目次
制作品
- 完成品
git_checkout_by_number.sh
#!/bin/bash # helpの表示 if [ "$1" = '-h' ]; then echo 'usage gcn <opt> <num>' echo '' echo 'opt' echo ' -h show help' echo ' -m integrate before into after' echo ' -p pull the branch after move' echo 'num' echo ' input the branch num' exit 1 fi branches=($(git for-each-ref --format='%(refname:short)' refs/heads/)) be_branch_name=($(git rev-parse --abbrev-ref HEAD)) echo "Available branches:" for i in "${!branches[@]}"; do printf "%3d" "$i" echo ": ${branches[$i]}" done if [[ "$1" =~ ^[0-9]+$ ]]; then branch_number=$1 else if [[ "$2" =~ ^[0-9]+$ ]]; then branch_number=$2 else read -p "Enter branch number to checkout: " branch_number if [ -z "$branch_number" ] || [ $branch_number = "q" ]; then echo "Invalid branch number." exit 1 fi fi fi af_branch_name=${branches[$branch_number]} echo "chosed branch: <" $af_branch_name ">" if [ -z "$af_branch_name" ]; then echo "Invalid branch number." exit 1 else echo ">> git checkout $af_branch_name" git checkout $af_branch_name fi if [[ "$1" =~ [p] ]]; then # 引数がある場合は、引数の値を出力 echo ">> git pull origin $af_branch_name" git pull origin $af_branch_name fi if [[ "$1" =~ [m] ]]; then # 引数がある場合は、引数の値を出力 echo ">> git merge $be_branch_name" git merge $be_branch_name fi
- 使い方
$ ./git_checkout_by_number.sh Available branches: 0: develop 1: feature/branch1 2: feature/branch2 Enter branch number to checkout: 1 Switched to branch 'feature/branch1'
シェルスクリプトを実行するとブランチの一覧が表示され、数字を指定することで、そのブランチに移動することができる。
./git_checkout_by_number.sh -m
のように引数をとにかく何か入れることで、ブランチの移動をした後にその前にいたブランチがマージされる
スクリプトの説明
ブランチの取得と表示
数字が二桁になっても揃うようにしている
branches=($(git for-each-ref --format='%(refname:short)' refs/heads/))
echo "Available branches:"
for i in "${!branches[@]}"; do
printf "%3d" "$i"
echo ": ${branches[$i]}"
done
入力の取得と例外処理
間違えた時とか用に入力なしまたはq
を入力することで実行が止まるようにしている
read -p "Enter branch number to checkout: " branch_number
if [ -z "$branch_number" ] || [ $branch_number = "q" ]; then
echo "Invalid branch number."
exit 1
fi
ブランチの取得とcheckout
移動先のブランチ名を取得し、あれば移動するようにする.
数字であれば範囲外のものを入れるとちゃんとエラーとなってくれるが、例えばa
とか入れると0のブランチに飛ぶ
なぜ??
af_branch_name=${branches[$branch_number]}
if [ -z "$af_branch_name" ]; then
echo "Invalid branch number."
else
git checkout $af_branch_name
fi
マージの処理
あらかじめ取得してあった現在のブランチをマージするように
引数を指定してもいいが、表記揺れがあっても実行するように今回はとにかく引数があればこれが実行されることとした
be_branch_name=($(git rev-parse --abbrev-ref HEAD))
...
if [ $# -gt 0 ]; then
# 引数がある場合は、引数の値を出力
git merge $be_branch_name
fi
.bashrc
への登録
gitは比較的どこでも使うので./bashrc
に登録したほうが使いやすいです
いちいちプロジェクトごとに置いとくのもignoreするのもめんどいですしね
自分の場合はgit_checkout_by_number.sh
を/usr/local/bin/mine/
において、
.bashrcに下記を追記しました。
export PATH=/usr/local/bin/mine/:$PATH
alias gcbn='git_checkout_by_number'
$ gcbn
で利用できます
参考文献
ごめんなさい
あったかもしれませんが忘れました
参考にした方ありがとうございました