きっかけ
「git stash
使いづらくね?」
git stash
は素晴らしいコマンドなんだけど、いまいちどのファイルでstashされるのか不安定。
- addしたものは全てstashされる
- change状態のファイルはstashされたりされなかったりする
ということで、stashしたいファイルだけstashできるコマンドを作ろうと思いました。
git commit -m '残す'
git add .
git stash save 'コメント(変数)'
git reset -s HEAD^
という一連の流れでaddしたもの以外をstashすることができると考えました。
とりあえず読んでみる
サブコマンドのサンプルがExtend Git with Custom Commands (Example)にあったので、とりあえず読んでみます。
これはgit squash 5
などでgit rebase -i HEAD~5
を実行できるというものです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/bin/sh
source "$(git --exec-path)/git-sh-setup"
USAGE="BACK NUMBER"
function _squash() { # _squash関数
if [[ $# == 1 ]]; then # 引数が1つのとき
if [[ -n $(git rev-parse --verify --quiet HEAD~$1) ]]; then # ちゃんと該当コミットがあるかどうか
git rebase -i HEAD~$1 # 実行するコマンド
else
die "HEAD~$1 does not exist" # 「HEAD~a does not exist」と表示される
fi
else
usage # 「usage: git squash COMMITS」と表示される
fi
}
_squash $1 # _squash関数を実行する
|
_squash $1
なので、git squash 2 3
としても、_squash
メソッドでは$1
しか使えない。
もし引数が可変長の場合は、_squash $@
のようにする。
「die」関数はエラーが発生した場合にプログラムを終了させる場合に使用し、エラーメッセージを出力しPerlスクリプトを終了します。
die関数 - プログラム制御に関する関数 - Perl関数のリファレンス
シェルスクリプトに挑戦しよう(5)スクリプトで引数を使用する[その1]:“応用力”をつけるためのLinux再入門(25) - @IT
実際に作る
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#!/bin/sh
source "$(git --exec-path)/git-sh-setup"
USAGE="COMMITS"
function _stit() {
# getoptsでのオプション判定
while getopts "ⓜ️" OPT
do
case $OPT in
m) OPT_FLAG_m=1; STASH_MESSAGE=$OPTARG;
esac
done
$COMMIT_MESSAGE = git log -1 --pretty='%s'
# オプション部分を切り捨て
shift `expr $OPTIND - 1`
if [ $@ ]; then
git add $@
fi
git commit -m 'left files'
git add .
if [ $STASH_MESSAGE ]; then
git stash save $STASH_MESSAGE
elif
git stash save $COMMIT_MESSAGE
fi
git reset --soft HEAD~
}
_stit
|
git staadd [ファイル名] -m 'メッセージ'
chmod +x
Linuxの権限確認と変更(chmod)(超初心者向け) - Qiita