Instantly share code, notes, and snippets.

Embed
What would you like to do?
Update all git repositories under a base directory
#!/bin/bash
# store the current dir
CUR_DIR=$(pwd)
# Let the person running the script know what's going on.
echo "\n\033[1mPulling in latest changes for all repositories...\033[0m\n"
# Find all git repositories and update it to the master latest revision
for i in $(find . -name ".git" | cut -c 3-); do
echo "";
echo "\033[33m"+$i+"\033[0m";
# We have to go to the .git parent directory to call the pull command
cd "$i";
cd ..;
# finally pull
git pull origin master;
# lets get back to the CUR_DIR
cd $CUR_DIR
done
echo "\n\033[32mComplete!\033[0m\n"
@maxandersen

This comment has been minimized.

Show comment
Hide comment
@maxandersen

maxandersen Jan 24, 2014

Thanks just what I needed ;)

maxandersen commented Jan 24, 2014

Thanks just what I needed ;)

@noteed

This comment has been minimized.

Show comment
Hide comment
@noteed

noteed Mar 6, 2014

Depending on your echo, you might need to use echo -e for the escape color code to work.

noteed commented Mar 6, 2014

Depending on your echo, you might need to use echo -e for the escape color code to work.

@dcht00

This comment has been minimized.

Show comment
Hide comment
@dcht00

dcht00 Nov 10, 2014

Cool. // True about "echo -e" !

dcht00 commented Nov 10, 2014

Cool. // True about "echo -e" !

@mndrix

This comment has been minimized.

Show comment
Hide comment
@mndrix

mndrix Apr 3, 2015

Thank you. I use a slight variation:

find . -name .git -type d \
| xargs -n1 -P4 -I% git --git-dir=% --work-tree=%/.. remote update -p

Using -type d prevents execution for ".git" files inside submodules. Using -P4 runs four fetches in parallel to speed things up a bit (and continues to make progress elsewhere if a single repository hangs). I prefer git remote update -p instead of git pull so that I can deal with merge conflicts later or rebase after I'm offline.

mndrix commented Apr 3, 2015

Thank you. I use a slight variation:

find . -name .git -type d \
| xargs -n1 -P4 -I% git --git-dir=% --work-tree=%/.. remote update -p

Using -type d prevents execution for ".git" files inside submodules. Using -P4 runs four fetches in parallel to speed things up a bit (and continues to make progress elsewhere if a single repository hangs). I prefer git remote update -p instead of git pull so that I can deal with merge conflicts later or rebase after I'm offline.

@iblech

This comment has been minimized.

Show comment
Hide comment
@iblech

iblech Apr 21, 2015

You need to enclose $CUR_DIR in quotes, like cd "$CUR_DIR" if $CUR_DIR happens to contain special characters. Alternatively, you could also run the loop body in a subshell (using (...)).

iblech commented Apr 21, 2015

You need to enclose $CUR_DIR in quotes, like cd "$CUR_DIR" if $CUR_DIR happens to contain special characters. Alternatively, you could also run the loop body in a subshell (using (...)).

@topmotiveret

This comment has been minimized.

Show comment
Hide comment
@topmotiveret

topmotiveret May 17, 2015

Thanks - h5!

topmotiveret commented May 17, 2015

Thanks - h5!

@CodeSammich

This comment has been minimized.

Show comment
Hide comment
@CodeSammich

CodeSammich Oct 29, 2015

Awesome. This works just as intended ^^

CodeSammich commented Oct 29, 2015

Awesome. This works just as intended ^^

@dhilsand

This comment has been minimized.

Show comment
Hide comment
@dhilsand

dhilsand Dec 31, 2015

Thanks this is what I was looking for!

dhilsand commented Dec 31, 2015

Thanks this is what I was looking for!

@bennyn

This comment has been minimized.

Show comment
Hide comment
@bennyn

bennyn May 30, 2016

Call stuff! Even runs on Windows 10. 😎

bennyn commented May 30, 2016

Call stuff! Even runs on Windows 10. 😎

@dmhowcroft

This comment has been minimized.

Show comment
Hide comment
@dmhowcroft

dmhowcroft Sep 21, 2016

What license is associated with this Gist? MIT? Apache? DWTFYW? :)

dmhowcroft commented Sep 21, 2016

What license is associated with this Gist? MIT? Apache? DWTFYW? :)

@nkh

This comment has been minimized.

Show comment
Hide comment
@nkh

nkh Oct 27, 2016

dmhowcroft,

Legally anything released without a copyright notice is public domain, the notice contains a year range. If you release something with a year range then a few years later you make changes without updating the copyright notice, then those changes are public domain.

It was nice of you to ask the author :)

nkh commented Oct 27, 2016

dmhowcroft,

Legally anything released without a copyright notice is public domain, the notice contains a year range. If you release something with a year range then a few years later you make changes without updating the copyright notice, then those changes are public domain.

It was nice of you to ask the author :)

@MrMikeyagi

This comment has been minimized.

Show comment
Hide comment
@MrMikeyagi

MrMikeyagi Dec 3, 2016

I have some gits organized with my other gits that no longer have working github pages and so when the script gets to them it asks for a username and password. Is there any way to add to the script to make it so it just enters nothing for both the username and password? (or any other way to make it skip that hangup). I'd like to keep the related gits together for organizational purposes if possible. Thank you so much for your time and this awesome and SUPER USEFUL script :)

EDIT - Also I forgot to add that I put "read" (without the quotes) at the end so I can read the text log before it closes :)

MrMikeyagi commented Dec 3, 2016

I have some gits organized with my other gits that no longer have working github pages and so when the script gets to them it asks for a username and password. Is there any way to add to the script to make it so it just enters nothing for both the username and password? (or any other way to make it skip that hangup). I'd like to keep the related gits together for organizational purposes if possible. Thank you so much for your time and this awesome and SUPER USEFUL script :)

EDIT - Also I forgot to add that I put "read" (without the quotes) at the end so I can read the text log before it closes :)

@devCharles

This comment has been minimized.

Show comment
Hide comment
@devCharles

devCharles Jun 18, 2017

hey guys if you want i have another script here, it follows the same idea here but with many other options, i am a noob so if you have some feedback or want to contribute please let me know :D
https://github.com/devCharles/gitRepoUpdater

devCharles commented Jun 18, 2017

hey guys if you want i have another script here, it follows the same idea here but with many other options, i am a noob so if you have some feedback or want to contribute please let me know :D
https://github.com/devCharles/gitRepoUpdater

@JamesSwift

This comment has been minimized.

Show comment
Hide comment
@JamesSwift

JamesSwift Oct 28, 2017

If you want this to work with submodules too, I'd suggest using a slightly altered version of @mndrix's solution:

find . -name .git -type d | xargs -n1 -P4 -I% git --git-dir=% --work-tree=%/.. fetch --all --recurse-submodules

If you need to manually enter passwords for some repos, use this instead:

find . -name .git -type d | xargs -n1 -I% git --git-dir=% --work-tree=%/.. fetch --all --recurse-submodules

The --recurse-submodules options tells git to also fetch commits from any submodules' upstream. It means that if you run this script then go offline and checkout a new version of one of your projects which references a new submodule commit, when you run git submodule update it will be still able to find the new commit.

JamesSwift commented Oct 28, 2017

If you want this to work with submodules too, I'd suggest using a slightly altered version of @mndrix's solution:

find . -name .git -type d | xargs -n1 -P4 -I% git --git-dir=% --work-tree=%/.. fetch --all --recurse-submodules

If you need to manually enter passwords for some repos, use this instead:

find . -name .git -type d | xargs -n1 -I% git --git-dir=% --work-tree=%/.. fetch --all --recurse-submodules

The --recurse-submodules options tells git to also fetch commits from any submodules' upstream. It means that if you run this script then go offline and checkout a new version of one of your projects which references a new submodule commit, when you run git submodule update it will be still able to find the new commit.

@agentbellnorm

This comment has been minimized.

Show comment
Hide comment
@agentbellnorm

agentbellnorm Mar 19, 2018

Perfect, thanks!

agentbellnorm commented Mar 19, 2018

Perfect, thanks!

@haythamdouaihy

This comment has been minimized.

Show comment
Hide comment
@haythamdouaihy

haythamdouaihy Apr 4, 2018

simple and does what is needed, thank you!

haythamdouaihy commented Apr 4, 2018

simple and does what is needed, thank you!

@djangofan

This comment has been minimized.

Show comment
Hide comment
@djangofan

djangofan Apr 20, 2018

#!/bin/bash
# run this from your workspace, which contains all your Git repos
CUR_DIR=$(pwd)
echo "\nUpdating remotes for all repositories...\n"
for i in $(find . -mindepth 1 -maxdepth 1 -type d); do
    printf "\nIn Folder: $i";
    cd "$i";
    printf "\n"
    THIS_REMOTES="$(git remote -v)"
    arr=($THIS_REMOTES)
    OLD_REMOTE="${arr[1]}";
    NEW_REMOTE="${OLD_REMOTE/git.old.net/git.new.org}"
    printf "New remote: $NEW_REMOTE"
    printf "\n"
    git remote set-url origin "$NEW_REMOTE"
    cd $CUR_DIR
done
printf "\nComplete!\n"

djangofan commented Apr 20, 2018

#!/bin/bash
# run this from your workspace, which contains all your Git repos
CUR_DIR=$(pwd)
echo "\nUpdating remotes for all repositories...\n"
for i in $(find . -mindepth 1 -maxdepth 1 -type d); do
    printf "\nIn Folder: $i";
    cd "$i";
    printf "\n"
    THIS_REMOTES="$(git remote -v)"
    arr=($THIS_REMOTES)
    OLD_REMOTE="${arr[1]}";
    NEW_REMOTE="${OLD_REMOTE/git.old.net/git.new.org}"
    printf "New remote: $NEW_REMOTE"
    printf "\n"
    git remote set-url origin "$NEW_REMOTE"
    cd $CUR_DIR
done
printf "\nComplete!\n"
@lonely-porcupine

This comment has been minimized.

Show comment
Hide comment
@lonely-porcupine

lonely-porcupine Apr 30, 2018

Hey guys,

thought about handling cases when there are some changes made in files or any other situation where just git pull won't succeed?

lonely-porcupine commented Apr 30, 2018

Hey guys,

thought about handling cases when there are some changes made in files or any other situation where just git pull won't succeed?

@crowtherdr

This comment has been minimized.

Show comment
Hide comment
@crowtherdr

crowtherdr May 23, 2018

Very helpful! Thank you

crowtherdr commented May 23, 2018

Very helpful! Thank you

@iancrowther

This comment has been minimized.

Show comment
Hide comment
@iancrowther

iancrowther commented Sep 3, 2018

thanks

@Nadeeshyama

This comment has been minimized.

Show comment
Hide comment
@Nadeeshyama

Nadeeshyama Sep 11, 2018

Thank you, very helpful. 👍

Nadeeshyama commented Sep 11, 2018

Thank you, very helpful. 👍

@rigtorp

This comment has been minimized.

Show comment
Hide comment
@rigtorp

rigtorp Sep 19, 2018

Simplest solution to fetch all remotes:

$ find . -name .git -type d -exec git --git-dir '{}' fetch --all ';'

rigtorp commented Sep 19, 2018

Simplest solution to fetch all remotes:

$ find . -name .git -type d -exec git --git-dir '{}' fetch --all ';'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment