From: Rudolf Polzer Date: Wed, 20 Oct 2010 14:09:40 +0000 (+0200) Subject: git-recurse: nice tool to recurse through sub-clones X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0a9ef413ea0a37c09882792cd0b5dc1a1699f550;p=xonotic%2Fdiv0-gittools.git git-recurse: nice tool to recurse through sub-clones --- diff --git a/git-recurse b/git-recurse new file mode 100755 index 0000000..e77c632 --- /dev/null +++ b/git-recurse @@ -0,0 +1,78 @@ +#!/bin/sh + +SEPARATOR=@@ + +# TODO this logic should probably rather be in rev-parse itself +processarg() +{ + prefix= + suffix= + case "$1" in + *..*) + first=${1%%..*} + rest=${1#*..} + first=`processarg "$first"` + rest=`processarg "$rest"` + echo "$first..$rest" + ;; + *@\{*) + first=${1%%@\{*} + rest=${1#*@\{} + first=`processarg "$first"` + echo "$first@{$rest" + ;; + *^*) + first=${1%%^*} + rest=${1#*^} + first=`processarg "$first"` + echo "$first^$rest" + ;; + *~*) + first=${1%%~*} + rest=${1#*~} + first=`processarg "$first"` + echo "$first~$rest" + ;; + *:*) + first=${1%%:*} + rest=${1#*:} + first=`processarg "$first"` + echo "$first:$rest" + ;; + ^*) + first=${1#^} + first=`processarg "$first"` + echo "^$first" + ;; + *$SEPARATOR*) + first=${1%%$SEPARATOR*} + rest=${1#*$SEPARATOR} + if git rev-parse "$first" >/dev/null 2>&1; then + echo "$first" + else + processarg "$rest" + fi + ;; + *) + echo "$1" + ;; + esac +} +processargs() +{ + first=true + for X in "$@"; do + if $first; then + first=false + # clear arg list + set -- + fi + set -- "$@" "`processarg "$X"`" + done + "$@" +} + +# recurse through all sub-repos +find . -type d -name \*.git | while IFS= read -r GITDIR; do + processargs git --git-dir="$GITDIR" --work-tree="${GITDIR%/.git}" "$@" +done