bytelyst-devops-tools/git-work-safety-tools/multi_repo_interactive_fix.sh

85 lines
2.6 KiB
Bash

#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
gitdirs=$(find . -type d -name ".git")
for gitdir in $gitdirs; do
repo=$(dirname "$gitdir")
cd "$repo" || continue
echo -e "${CYAN}📁 Repository: $repo${NC}"
# Check status
uncommitted=$(git status --porcelain | wc -l | tr -d ' ')
git remote update > /dev/null 2>&1
if git rev-parse --abbrev-ref --symbolic-full-name @{u} > /dev/null 2>&1; then
ahead=$(git rev-list --count @{u}..HEAD 2>/dev/null)
behind=$(git rev-list --count HEAD..@{u} 2>/dev/null)
else
ahead=0
behind=0
fi
# Handle uncommitted changes
if [ "$uncommitted" -gt 0 ]; then
echo -e " ${YELLOW}You have $uncommitted uncommitted change(s).${NC}"
git status --short
echo " What do you want to do?"
select action in "Commit" "Stash" "Skip"; do
case $action in
Commit)
echo " Enter commit message:"
read msg
git add -A
git commit -m "$msg"
break
;;
Stash)
git stash push -u -m "Interactive stash by script"
break
;;
Skip)
echo " Skipping uncommitted changes."
break
;;
esac
done
fi
# Handle behind remote
if [ "$behind" -gt 0 ]; then
echo -e " ${YELLOW}Your branch is behind remote by $behind commit(s).${NC}"
echo " Do you want to pull (rebase) now? (y/n)"
read ans
if [[ "$ans" =~ ^[Yy]$ ]]; then
git pull --rebase
fi
fi
# Handle unpushed commits
if [ "$ahead" -gt 0 ]; then
echo -e " ${YELLOW}You have $ahead local commit(s) not pushed to remote.${NC}"
echo " Do you want to push now? (y/n)"
read ans
if [[ "$ans" =~ ^[Yy]$ ]]; then
git push
fi
fi
# Handle stashes
stash_count=$(git stash list | wc -l | tr -d ' ')
if [ "$stash_count" -gt 0 ]; then
echo -e " ${YELLOW}You have $stash_count stash(es). Do you want to pop the latest? (y/n)${NC}"
read ans
if [[ "$ans" =~ ^[Yy]$ ]]; then
git stash pop
fi
fi
echo -e "${CYAN}──────────────────────────────────────────────${NC}"
cd - > /dev/null || exit
done