DEV Community

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

Posted on • Edited 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.

Demo

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

Top comments (3)

Collapse
 
jkfran profile image
jkfran

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. gitbulk.com

Collapse
 
kasuken profile image
Emanuele Bartolesi

thanks for sharing!

Collapse
 
devaloza profile image
Deval

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:

#!/bin/bash

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
        else
            # 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
            else
                echo "$branch is up to date"
            fi
        fi
    else
        echo "Not one of the default branches. Pull it manually."
    fi

    popd > /dev/null
}

echo "Starting..."
for i in $repos; do
    # https://www.git-tower.com/learn/git/faq/cleanup-remote-branches-with-git-prune
    echo $i
    echo "Git fetch prune: $i"
    pushd "$i" > /dev/null
    git fetch --prune

    update_repos

    popd > /dev/null

    echo "----------------------------------------------------"
done
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.