update_all_git_repo.sh
· 2.3 KiB · Bash
Raw
#!/bin/bash
usage() {
echo "Usage ${0} [[--ignore|-i] dir_name] [--main]"
echo " --help Show this help"
echo " --main Checkout to main branch"
echo " --ignore=* Ignore folders"
exit 1
}
find_folders() {
set -- ./ -name ".git" -type d
for IGNORE_FOLDER in ${IGNORE_FOLDERS}
do
set -- "$@" -not -path '"*/'${IGNORE_FOLDER}'/*"'
done
find $@
}
# Map long options to short ones and rebuild argv
translated=()
while (( $# )); do
case "$1" in
--help) translated+=("-h"); shift ;;
--main) translated+=("-m"); shift ;;
--ignore=*) translated+=("-i" "${1#*=}"); shift ;;
--) translated+=("--"); shift; translated+=("$@"); set -- ;;
*) translated+=("$1"); shift ;;
esac
done
set -- "${translated[@]}"
IGNORE_FOLDERS=""
FLAG_SWITCH_TO_MAIN=""
while getopts ":hmi:" opt; do
case "$opt" in
h) usage;;
m) FLAG_SWITCH_TO_MAIN=1;;
i) IGNORE_FOLDERS="${IGNORE_FOLDERS} ${OPTARG}";;
:) echo "Missing arg for -$OPTARG"; usage;;
\?) echo "Invalid option: -$OPTARG"; usage;;
esac
done
for DIR in $(find_folders)
do
pushd ${PWD} > /dev/null
echo "[DEBUG] Work with $(dirname ${DIR})"
cd $(dirname ${DIR})
if [[ -n $(git status --porcelain) ]]
then
echo "[WARN] There are uncommitted changes."
declare UNCOMMIT_CHANGES=1
git stash
fi
declare MASTER_BRANCH="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')"
declare CURRENT_BRANCH="$(git branch --show-current)"
if [[ "$MASTER_BRANCH" == "$CURRENT_BRANCH" ]]
then
git pull --all
git remote prune origin
else
git checkout ${MASTER_BRANCH}
git pull --all
git remote prune origin
if [[ -z "${FLAG_SWITCH_TO_MAIN}" ]]
then
git checkout ${CURRENT_BRANCH} || echo "[WARN] current brach has been deleted"
fi
fi
git branch --merged | grep -v "^*\|${MASTER_BRANCH}" | xargs -r git branch -D
if [ ! -z "$UNCOMMIT_CHANGES" ]
then
git stash pop
fi
unset UNCOMMIT_CHANGES MASTER_BRANCH CURRENT_BRANCH
popd > /dev/null
done
| 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 |
| 80 |