Skip to content

Instantly share code, notes, and snippets.

@douglas
Created October 14, 2011 15:04
Show Gist options
  • Select an option

  • Save douglas/1287372 to your computer and use it in GitHub Desktop.

Select an option

Save douglas/1287372 to your computer and use it in GitHub Desktop.
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"
@crowtherdr

Copy link
Copy Markdown

Very helpful! Thank you

@iancrowther

Copy link
Copy Markdown

thanks

@nadee-org

Copy link
Copy Markdown

Thank you, very helpful. πŸ‘

@rigtorp

rigtorp commented Sep 19, 2018

Copy link
Copy Markdown

Simplest solution to fetch all remotes:

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

@harisankar-krishna-swamy

harisankar-krishna-swamy commented Oct 29, 2018

Copy link
Copy Markdown

For all find commands -prune will help save time by not searching inside of .git folders. (find man page mentions this).

find ~/GIT-REPOSITORIES ( -exec test -d '{}'/.git ; ) -print -prune

Pipe from there or so
find ~/GIT-REPOSITORIES ( -exec test -d '{}'/.git ; ) -print -prune | xargs -n1 -I% git --git-dir=%/.git --work-tree=%/ pull --all

@shastrula

Copy link
Copy Markdown

This is the variation I use:
#To Pull

#!/usr/bin/env bash for repo in $(find . -name ".git" | cut -c 3- | sed 's/.git//g'); do current_branch=git -C ${repo} branch\|grep '*'\|cut -d' ' -f2;echo -e "Pulling repo: ${repo} \t on branch: ${current_branch}"; git -C $repo pull done

#To View

#!/usr/bin/env bash for repo in $(find . -name ".git" | cut -c 3- | sed 's/.git//g'); do current_branch=git -C ${repo} branch\|grep '*'\|cut -d' ' -f2;echo -e "repo: ${repo} \t on branch: ${current_branch}" done

@boyter

boyter commented Oct 22, 2019

Copy link
Copy Markdown

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 :)

Actually that's not 100% true but fairly close. Its not possible for Australians or Germans to release anything public domain as neither counties allow citizens to give away their rights. Its one of the reasons its so important to license things.

@joeytwiddle

Copy link
Copy Markdown

@harisankar-krishna-swamy

Copy link
Copy Markdown

find . -maxdepth 8 -name '.git' -prune -type d -printf '%h\n' | parallel --eta 'echo {} && git -C {} pull'

remove echo and --eta if not needed.

@lucasmodrich

Copy link
Copy Markdown

Works perfectly. Thanks!

@valentin9

Copy link
Copy Markdown

Thanks!

@jazz-it

jazz-it commented Sep 7, 2020

Copy link
Copy Markdown

find . -maxdepth 8 -name '.git' -prune -type d -printf '%h\n' | parallel --eta 'echo {} && git -C {} pull'

Very simple, yet effective and blazingly fast. Amazing! Thanks, @harisankar-krishna-2015

@douglas

douglas commented Oct 19, 2020

Copy link
Copy Markdown
Author

Heh! I had this need again after 9 years and was surprised by the amount of comments =)

Thanks for all suggestions - I will update the gist with improvements to run on macos and Linux πŸ‘

@jensthomsenEV

jensthomsenEV commented Mar 9, 2021

Copy link
Copy Markdown

How will this work in visual studio code with a workspace setup? I would like to be able to do a pull-from in all the repositories in the workspace, followed by a syncronization, except if there is a merge conflict.

@NorkzYT

NorkzYT commented Jun 15, 2022

Copy link
Copy Markdown

How will this work in visual studio code with a workspace setup? I would like to be able to do a pull-from in all the repositories in the workspace, followed by a syncronization, except if there is a merge conflict.

Did you find a solution to this or an alternative?

@vhristev

Copy link
Copy Markdown

Here is a solution for MacOSX:
Im running that from my root repo folder ( no .git in that folder )

~/Documents/repos/
~/Documents/repos/repo1
~/Documents/repos/repo2
/usr/bin/find . -maxdepth 1 -type d -print | parallel --eta 'echo {} && git -C {} pull'

@Andrei-Fogoros

Copy link
Copy Markdown

Hello @douglas,

Under which license is the above code released?

Thanks in advance! :)

@douglas

douglas commented Jan 2, 2024

Copy link
Copy Markdown
Author

Hello folks!

New year and just had to use it again - thanks for letting me know about GNU parallel =)

About the license, it is public domain - do whatever you want with it provided the gist is not used in a malicious context πŸ‘

@Andrei-Fogoros

Copy link
Copy Markdown

Hello folks!

New year and just had to use it again - thanks for letting me know about GNU parallel =)

About the license, it is public domain - do whatever you want with it provided the gist is not used in a malicious context πŸ‘

Thank you very much, Douglas!
Happy New Year! :)

@ramonsmits

Copy link
Copy Markdown

Had to replace all echo with printf for ANSI color output to work on Fedora 41

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