DEV Community

Cover image for Update & Sync GitHub Repositories in the morning
Emanuele Bartolesi
Emanuele Bartolesi

Posted on • Updated on

Update & Sync GitHub Repositories in the morning

I have many habits during the day, and the most important of all is my morning routine.
As you see below I use Microsoft ToDo to remind me what I need to do each morning and one of the steps I need to do is to update my local GitHub repositories.
I have many of that and of course it's not possible to do it manually.

Microsoft ToDo

This is the reason why I have created a PowerShell script that works for me.
You can copy my code and put the script in the main folder of your GitHub repositories and launch it from the command line.
It takes more or less 3-5 minutes (but it depends on how many repositories you have locally).

As you can see in the script, I use the command "git fetch prune".
This command helps to stay with clean branches and folders.
You can learn more on this topic at this link.

In the video below you can see the script running on my machine.


Feel free to share your feedback or make some changes to the script.

Top comments (3)

jkfran profile image

Hi, this is cool to keep your local repositories up to date. I created recently something to help devs perform changes across multiple repos, it’s just a basic find & replace but I just want to share it here if that’s fine.

kasuken profile image
Emanuele Bartolesi

thanks for sharing!

devaloza profile image

Hey. Thanks for the script. I know this is old post and people who are using mac/linux had already developed the similar script (bash file) for themselves. Though I am posting bash-script which is running fine in my macbook. So if incase someone is looking for this post in future, it might help:


branches=("master" "main" "develop" "dev")

# Get all directories in the current directory (just the first level)
repos=$(find ./* -maxdepth 1 -type d -name ".git")
function update_repos {
    pushd ".." > /dev/null

    branch=$(git rev-parse --abbrev-ref HEAD)
    echo "Current branch: $branch"

    if [[ " ${branches[*]} " == *" $branch "* ]]; then
        if git status --porcelain | grep -q '^\?\?'; then
            # Untracked files exist
            echo "There are untracked files" >&2
        elif git status --porcelain | grep -vq '^\?\?'; then
            # Uncommitted changes
            echo "There are uncommitted changes" >&2
            # All clear
            branch=$(git rev-parse --abbrev-ref HEAD)
            head=$(git rev-parse HEAD)
            origin=$(git rev-parse origin/HEAD)

            if [ "$head" != "$origin" ]; then
                echo "Pulling changes on branch: $branch"
                git pull
                echo "$branch is up to date"
        echo "Not one of the default branches. Pull it manually."

    popd > /dev/null

echo "Starting..."
for i in $repos; do
    echo $i
    echo "Git fetch prune: $i"
    pushd "$i" > /dev/null
    git fetch --prune


    popd > /dev/null

    echo "----------------------------------------------------"
echo "Your GitHub folder is up to date."

echo "----------------------------------------------------"
echo "----------------------------------------------------"
echo "Removing bin & obj folders"
#find . -type d \( -name "bin" -o -name "obj" \) -not -path "./node_modules/*" -exec rm -rf {} +
echo "All bin & obj files and folders are removed."

Enter fullscreen mode Exit fullscreen mode

Feel free to share your feedback/make some changes in this script.
PS: I have commented out this code in my script:All bin & obj files and folders are removed.