This page looks best with JavaScript enabled
⚠️

【Git】サブコマンドのすゝめ

 ·   ·  ☕ 2 分で読めます
✏️

きっかけ

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

Share on

END
END
@aiandrox

 
目次