Skip to content

Instantly share code, notes, and snippets.

@mzabriskie
Last active February 5, 2024 15:10
Show Gist options
  • Save mzabriskie/6631607 to your computer and use it in GitHub Desktop.
Save mzabriskie/6631607 to your computer and use it in GitHub Desktop.
Check git status of multiple repos

If you're like me you have a dir like ~/Workspace/Github where all your git repos live. I often find myself making a change in a repo, getting side tracked and ending up in another repo, or off doing something else all together. After a while I end up with several repos with modifications. This script helps me pick up where I left off by checking the status of all my repos, instead of having to check each one individually.

Usage:

git-status [directory]

This will run git status on each repo under the directory specified. If called with no directory provided it will default to the current directory.

#!/bin/bash
dir="$1"
# No directory has been provided, use current
if [ -z "$dir" ]
then
dir="`pwd`"
fi
# Make sure directory ends with "/"
if [[ $dir != */ ]]
then
dir="$dir/*"
else
dir="$dir*"
fi
# Loop all sub-directories
for f in $dir
do
# Only interested in directories
[ -d "${f}" ] || continue
echo -en "\033[0;35m"
echo "${f}"
echo -en "\033[0m"
# Check if directory is a git repository
if [ -d "$f/.git" ]
then
mod=0
cd $f
# Check for modified files
if [ $(git status | grep modified -c) -ne 0 ]
then
mod=1
echo -en "\033[0;31m"
echo "Modified files"
echo -en "\033[0m"
fi
# Check for untracked files
if [ $(git status | grep Untracked -c) -ne 0 ]
then
mod=1
echo -en "\033[0;31m"
echo "Untracked files"
echo -en "\033[0m"
fi
# Check for unpushed changes
if [ $(git status | grep 'Your branch is ahead' -c) -ne 0 ]
then
mod=1
echo -en "\033[0;31m"
echo "Unpushed commit"
echo -en "\033[0m"
fi
# Check if everything is peachy keen
if [ $mod -eq 0 ]
then
echo "Nothing to commit"
fi
cd ../
else
echo "Not a git repository"
fi
echo
done
@marouenes
Copy link

Maybe considering adding a help context would be nice :D. I can submit an improvement if it's fine.

@melMass
Copy link

melMass commented May 16, 2022

Thanks, for recursion you can replace line 70 with ./$0 "${f}"

@jadjay
Copy link

jadjay commented Oct 27, 2022

Hello,

I add a "DEBUG" var to get shorter results on large directories

@jadjay
Copy link

jadjay commented Oct 27, 2022

the patch

2a3
> DEBUG=no #yes
24,27c25,30
<
<       echo -en "\033[0;35m"
<       echo "${f}"
<       echo -en "\033[0m"
---
>       if [[ $DEBUG == "yes" ]]
>       then
>               echo -en "\033[0;35m"
>               echo "${f}"
>               echo -en "\033[0m"
>       fi
31a35,41
>               if [[ $DEBUG != "yes" ]]
>               then
>                       echo -en "\033[0;35m"
>                       echo "${f}"
>                       echo -en "\033[0m"
>               fi
>
65c75,78
<                       echo "Nothing to commit"
---
>                       if [[ $DEBUG == "yes" ]]
>                       then
>                               echo "Nothing to commit"
>                       fi
70c83,90
<               echo "Not a git repository"
---
>               if [[ $DEBUG == "yes" ]]
>               then
>                       echo "Not a git repository"
>               fi
>       fi
>       if [[ $DEBUG == "yes" ]]
>       then
>               echo
72,73d91
<
<       echo
74a93
>

@Patil-1008
Copy link

can anyone please help me how to use this snippet in my unix? do I need to save this file and make it executable?

@Pablo1107
Copy link

can anyone please help me how to use this snippet in my unix? do I need to save this file and make it executable?

Yes, you need to download the script and run chmod +x git-status.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment