手抜きgit更新スクリプト

本来の目的とは違ったりしますが、自分の書いたTextのメモやら.rstやら、PDFなどのバイナリも含めた色々な情報を複数の端末で同期するのにgitを活用していたりします。
イマドキ(cloudとか、SaaSとか?)っぽくないよねと言われるかもしれませんが、オフラインな環境や状況も多々有るわけで、やっぱり最後はローカルにデータが欲しいのですよね。
そこで、 /gitpath/hogehgoe  , /gitpath/fugafuga とか複数のディレクトリでメモを管理しているのですが、pushをするのにいちいち
$ cd ./gitpath/hogehoge
$ git add .
$ git commit
$ git push
とかやっていたりするのが難儀になったので、コマンド一発でカレントディレクトリ配下のgitをまとめて commit したり push したりする script を書いてみた。
美しくない部分が多々有るかと思いますが、そこは暖かい目で見過ごしてください (汗
#! /bin/bash

#
# Auto git update tool
#  2011/06/05 Ver:1.3 joey chen
#

#
# check depend commands
#
_dependCommands="git expect"
for _COMMAND in ${_dependCommands}; do
 if [ ! `whereis ${_COMMAND} |grep ${_COMMAND}` ]; then
  echo "ERROR!! 必要なコマンドが見つかりません : ${_COMMAND}"
  exit 1
 fi
done

#
# check args
#
if [ $# -eq 0 ]; then
  cat <<_EOF_

  Auto git pull/push Tool 

  実行中のディレクトリ配下にある複数あるgitディレクトリを一気に
  更新(commit/pull/push)するツールです。

  使い方
   sh ./updateGit.sh [commit|pull|push|status] [remote name] [branch name]
    各ディレクトリの ./*/.git を探して、有る場合に指定の git のコマンドを実行します。
    オプションは以下のいずれかを選ぶ必要があります。
    commit : add を実行してから commit します。
    status : git status 処理を実施します。
    pull   : 指定した remote からpullします。初回のみパスワード入力を促されます。
    push   : 指定した remote からpushします。初回のみパスワード入力を促されます。
    ※ branch name を指定していない場合は、自動で master で処理します。

_EOF_
  exit 1
fi

#
# check args 2nd
#
if [ \( $1 != 'pull' \) -a \( $1 != 'push' \) -a \( $1 != 'commit' \) -a \( $1 != 'status' \) ]; then
  echo "ERROR!! 正しい引数を指定してください。"
  exit 1
fi

if [ \( \( $1 = 'pull' \) -o \( $1 = 'push' \) \) -a \( $# -eq 1 \) ]; then
  echo "ERROR!! push か pull を実行する際は、第2引数(remote 識別子)を指定してください。"
  exit 1
fi

#
# Get git dirs
#
_GITDIRS=`find . -name ".git" | sed "s/\(\.\/.*\)\/.git/\1/g"`

#
# show status
#
if [ $1 == 'status' ]; then
  for _DIRS in ${_GITDIRS}; do
    echo -e "\n  -- ${_DIRS} -- ";
    cd $_DIRS;
    git status;
    cd ../
  done
fi

#
# Update Git Dirs
#

## COMMIT
if [ $1 == 'commit' ]; then
  # update dirs
  for _DIRS in ${_GITDIRS}; do
    echo -e "\n  -- ${_DIRS} -- ";
    cd $_DIRS;
     git add -u;
     git add .;
     git commit -m "auto Update by Script at `date`";
    cd ../
  done
fi

## PUSH or PULL
if [ \( $1 == 'push' \) -o \( $1 == 'pull' \) ]; then
  if [ $# -eq 2 ]; then
    _COMMAND=$1
    _REMOTE=$2
    _BRANCH="master"
  fi
  if [ $# -eq 3 ]; then
    _COMMAND=$1
    _REMOTE=$2
    _BRANCH=$3
  fi
  # get password
  stty -echo
  read -p "Password: " _PW; echo
  stty echo

  # update dirs
  for _DIRS in ${_GITDIRS}; do
    echo -e "\n  -- ${_DIRS} -- ";
    cd $_DIRS;
    expect -c "
      set timeout 10
      spawn git ${_COMMAND} ${_REMOTE} ${_BRANCH}
      expect password:\  ; send \"${_PW}\r\"
      interact
    "
    cd ../
  done
fi

 

2013/07/15 渋川氏のアドバイスで一部修正

diff --git a/updateGit.sh b/updateGit.sh
index ab53aa9..c0e2a0b 100755
--- a/updateGit.sh
+++ b/updateGit.sh
@@ -58,7 +58,7 @@ fi
 #
 # Get git dirs
 #
-_GITDIRS=`find . -type d -name ".git" | sed "s/\(\.\/.*\)\/.git/\1/g"`
+_GITDIRS=`find . -name ".git" | sed "s/\(\.\/.*\)\/.git/\1/g"`

 #
 # show status

手抜きgit更新スクリプト” への2件のコメント

  1. 60行目の-typeは外してもいいかな、と思いました。submodule使っていると、親の.gitのパス名が入ったテキストファイルの.gitが作られるので、外すとsubmodule内も一括で処理できます。

  2. > 渋川よしき さん
    すみません。今頃コメントに気がつきました。 ^^;;
    早速更新してみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です