本来の目的とは違ったりしますが、自分の書いた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
60行目の-typeは外してもいいかな、と思いました。submodule使っていると、親の.gitのパス名が入ったテキストファイルの.gitが作られるので、外すとsubmodule内も一括で処理できます。
> 渋川よしき さん
すみません。今頃コメントに気がつきました。 ^^;;
早速更新してみます。