botanikanet revised this gist 6 days ago. Go to revision
1 file changed, 79 insertions
update_all_git_repo.sh(file created)
| @@ -0,0 +1,79 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | usage() { | |
| 4 | + | echo "Usage ${0} [[--ignore|-i] dir_name] [--main]" | |
| 5 | + | echo " --help Show this help" | |
| 6 | + | echo " --main Checkout to main branch" | |
| 7 | + | echo " --ignore=* Ignore folders" | |
| 8 | + | exit 1 | |
| 9 | + | } | |
| 10 | + | ||
| 11 | + | find_folders() { | |
| 12 | + | set -- ./ -name ".git" -type d | |
| 13 | + | for IGNORE_FOLDER in ${IGNORE_FOLDERS} | |
| 14 | + | do | |
| 15 | + | set -- "$@" -not -path '"*/'${IGNORE_FOLDER}'/*"' | |
| 16 | + | done | |
| 17 | + | find $@ | |
| 18 | + | } | |
| 19 | + | ||
| 20 | + | # Map long options to short ones and rebuild argv | |
| 21 | + | translated=() | |
| 22 | + | while (( $# )); do | |
| 23 | + | case "$1" in | |
| 24 | + | --help) translated+=("-h"); shift ;; | |
| 25 | + | --main) translated+=("-m"); shift ;; | |
| 26 | + | --ignore=*) translated+=("-i" "${1#*=}"); shift ;; | |
| 27 | + | --) translated+=("--"); shift; translated+=("$@"); set -- ;; | |
| 28 | + | *) translated+=("$1"); shift ;; | |
| 29 | + | esac | |
| 30 | + | done | |
| 31 | + | set -- "${translated[@]}" | |
| 32 | + | ||
| 33 | + | IGNORE_FOLDERS="" | |
| 34 | + | FLAG_SWITCH_TO_MAIN="" | |
| 35 | + | ||
| 36 | + | while getopts ":hmi:" opt; do | |
| 37 | + | case "$opt" in | |
| 38 | + | h) usage;; | |
| 39 | + | m) FLAG_SWITCH_TO_MAIN=1;; | |
| 40 | + | i) IGNORE_FOLDERS="${IGNORE_FOLDERS} ${OPTARG}";; | |
| 41 | + | :) echo "Missing arg for -$OPTARG"; usage;; | |
| 42 | + | \?) echo "Invalid option: -$OPTARG"; usage;; | |
| 43 | + | esac | |
| 44 | + | done | |
| 45 | + | ||
| 46 | + | for DIR in $(find_folders) | |
| 47 | + | do | |
| 48 | + | pushd ${PWD} > /dev/null | |
| 49 | + | echo "[DEBUG] Work with $(dirname ${DIR})" | |
| 50 | + | cd $(dirname ${DIR}) | |
| 51 | + | if [[ -n $(git status --porcelain) ]] | |
| 52 | + | then | |
| 53 | + | echo "[WARN] There are uncommitted changes." | |
| 54 | + | declare UNCOMMIT_CHANGES=1 | |
| 55 | + | git stash | |
| 56 | + | fi | |
| 57 | + | declare MASTER_BRANCH="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')" | |
| 58 | + | declare CURRENT_BRANCH="$(git branch --show-current)" | |
| 59 | + | if [[ "$MASTER_BRANCH" == "$CURRENT_BRANCH" ]] | |
| 60 | + | then | |
| 61 | + | git pull --all | |
| 62 | + | git remote prune origin | |
| 63 | + | else | |
| 64 | + | git checkout ${MASTER_BRANCH} | |
| 65 | + | git pull --all | |
| 66 | + | git remote prune origin | |
| 67 | + | if [[ -z "${FLAG_SWITCH_TO_MAIN}" ]] | |
| 68 | + | then | |
| 69 | + | git checkout ${CURRENT_BRANCH} || echo "[WARN] current brach has been deleted" | |
| 70 | + | fi | |
| 71 | + | fi | |
| 72 | + | git branch --merged | grep -v "^*\|${MASTER_BRANCH}" | xargs -r git branch -D | |
| 73 | + | if [ ! -z "$UNCOMMIT_CHANGES" ] | |
| 74 | + | then | |
| 75 | + | git stash pop | |
| 76 | + | fi | |
| 77 | + | unset UNCOMMIT_CHANGES MASTER_BRANCH CURRENT_BRANCH | |
| 78 | + | popd > /dev/null | |
| 79 | + | done | |
Newer
Older