Easy way to pull latest of all git submodules

ID : 382

viewed : 29

Tags : gitgit-submodulesgit

Top 5 Answer for Easy way to pull latest of all git submodules

vote vote

91

If it's the first time you check-out a repo you need to use --init first:

git submodule update --init --recursive 

For git 1.8.2 or above, the option --remote was added to support updating to latest tips of remote branches:

git submodule update --recursive --remote 

This has the added benefit of respecting any "non default" branches specified in the .gitmodules or .git/config files (if you happen to have any, default is origin/master, in which case some of the other answers here would work as well).

For git 1.7.3 or above you can use (but the below gotchas around what update does still apply):

git submodule update --recursive 

or:

git pull --recurse-submodules 

if you want to pull your submodules to latest commits instead of the current commit the repo points to.

See git-submodule(1) for details

vote vote

80

git pull --recurse-submodules --jobs=10 

a feature git first learned in 1.8.5.

Until the bug is fixed, for the first time you do need to run

git submodule update --init --recursive

vote vote

79

On init running the following command:

git submodule update --init --recursive 

from within the git repo directory, works best for me.

This will pull all latest including submodules.

Explained

git - the base command to perform any git command     submodule - Inspects, updates and manages submodules.         update - Update the registered submodules to match what the superproject         expects by cloning missing submodules and updating the working tree of the         submodules. The "updating" can be done in several ways depending on command         line options and the value of submodule.<name>.update configuration variable.             --init without the explicit init step if you do not intend to customize             any submodule locations.             --recursive is specified, this command will recurse into the registered             submodules, and update any nested submodules within. 

After this you can just run:

git submodule update --recursive 

from within the git repo directory, works best for me.

This will pull all latest including submodules.

vote vote

62

Note: This is from 2009 and may have been good then but there are better options now.

We use this. It's called git-pup:

#!/bin/bash # Exists to fully update the git repo that you are sitting in...  git pull && git submodule init && git submodule update && git submodule status 

Just put it in a suitable bin directory (/usr/local/bin). If on Windows, you may need to modify the syntax to get it to work :)

Update:

In response to the comment by the original author about pulling in all of the HEADs of all of the submodules -- that is a good question.

I am pretty sure that git does not have a command for this internally. In order to do so, you would need to identify what HEAD really is for a submodule. That could be as simple as saying master is the most up to date branch, etc...

Following this, create a simple script that does the following:

  1. check git submodule status for "modified" repositories. The first character of the output lines indicates this. If a sub-repo is modified, you may NOT want to proceed.
  2. for each repo listed, cd into it's directory and run git checkout master && git pull. Check for errors.
  3. At the end, I suggest you print a display to the user to indicate the current status of the submodules -- perhaps prompt them to add all and commit?

I'd like to mention that this style is not really what git submodules were designed for. Typically, you want to say "LibraryX" is at version "2.32" and will stay that way until I tell it to "upgrade".

That is, in a sense, what you are doing with the described script, but just more automatically. Care is required!

Update 2:

If you are on a windows platform, you may want to look at using Python to implement the script as it is very capable in these areas. If you are on unix/linux, then I suggest just a bash script.

Need any clarifications? Just post a comment.

vote vote

57

Henrik is on the right track. The 'foreach' command can execute any arbitrary shell script. Two options to pull the very latest might be,

git submodule foreach git pull origin master 

and,

git submodule foreach /path/to/some/cool/script.sh 

That will iterate through all initialized submodules and run the given commands.

Top 3 video Explaining Easy way to pull latest of all git submodules

Related QUESTION?