How do I git clone --recursive and checkout master on all submodules in a single line?
Asked Answered
E

5

65

I really like this command to fetch a repo with submodules:

git clone [email protected]:my_user/my_repo.git --recursive

However, the submodules are all set to "no branch" when they arrive, and I have to manually checkout master on each and every one. Is there a way to recursively pull submodules and automatically set the branch to master?

Egregious answered 24/6, 2011 at 23:47 Comment(0)
O
95

After cloning the repository containing your submodules, the following command will checkout the master branch on all of these in one go:

git submodule foreach --recursive git checkout master
Ornament answered 25/9, 2012 at 8:13 Comment(2)
exactly what I was looking for to update submodules in my vim vundle dirGameto
you can add this to your personal .gitconfig or the repo's .git/config as an [alias] for profit!Promethium
C
76

How about:

git submodule update --init --recursive

To initialize all submodules and submodules inside submodules. Not sure if this will checkout master though.

Cartwright answered 25/6, 2011 at 0:35 Comment(2)
Thanks. It doesn't checkout master, just all the submodules! (which is exactly what I wanted)Welloff
use git submodule foreach --recursive git checkout master for checking out the master of each submodulesCubicle
F
26

The question is why you checkout master. Your sub modules are pinned to a specific sha - that's also why the sub module clones are fixed to that specific commit. By not pointing to a specific sha an external repo could easily break your builds. Most definitely not what you want. Better update consciously. Builds should be reproducible and as fix as possible.

Fornix answered 28/12, 2011 at 22:11 Comment(4)
I agree with that, but this is really annoying. If the specific commits belongs to a branch, why can't the submodule be checkout out in this branch at this specific commit?Respiratory
Because a commit ID is fixed while a branch can move. They are two different things and can point to two different snapshots of the submodule.Chinkapin
As an example of why: My team and I use a central repo of submodules as a sort of super repo to collect all of the smaller, related module repos to build the entire project locally. It saves the hassle of having to manually download 15+ different repos, especially if you want to move your environment to a different machine, vm etc.Interlocutory
After 10 years this is still relevant.Anthelion
E
12

As already answered

git submodule foreach --recursive git checkout master

does the job for the branch master.

But if it is a branch that is not present in all of the submodules one can use

git submodule foreach --recursive "git checkout branchname || true"

Otherwise the command will fail on the first repo not having the specified branch.

Expertize answered 11/3, 2019 at 11:53 Comment(1)
works 10x git submodule foreach --recursive "git checkout master || git checkout main". thank you insane woke people.Talavera
O
7

Perhaps you should consider gitslave as an alternative to git-submodule, depending on your development workflow it may be better (or worse). Specifically to your issue, gitslave keeps all members of the superproject on the same branch (absent specific git (not gitslave) commands to do otherwise, and even then many commands warn you when you are on different branches).

Gitslave is useful when you control and develop on the subprojects at more of less the same time as the superproject, and furthermore when you typically want to tag, branch, push, pull, etc all repositories at the same time.

git-submodule is better when you do not control the subprojects or more specifically wish to fix the subproject at a specific revision even as the subproject changes.

Odrick answered 25/6, 2011 at 0:3 Comment(2)
is it possible to specify which submodules needs to be synchronized and which doesn't? i.e. to exclude some submodules from this behaviour?Respiratory
@Savageman: With gitslave there are several ways to perform subset selection when executing a command over a set of slaves: regular expressions, a file containing the subset, etc. With git-submodule, it looks like you might be able to do it by explicitly naming each submodule on the command line, but I have not tried that.Odrick

© 2022 - 2024 — McMap. All rights reserved.