I’m not clear on what the following means (from the Git submodule update documentation):
…will make the submodules HEAD be detached, unless
--rebaseor--mergeis specified…
How does --rebase/--merge change things?
My main use case is to have a bunch of central repositories, which I will embed via submodules into other repositories. I would like to be able to improve on these central repositories, either directly in their original location, or from within their embedding repositories (the ones that use them via submodule).
- From within these submodules, can I create branches/modifications and use push/pull just like I would in regular repositories, or are there things to be cautious about?
- How would I advance the submodule referenced commit from say (tagged) 1.0 to 1.1 (even though the head of the original repository is already at 2.0), or pick which branch’s commit is used at all?
This GitPro page does summarize the consequence of a git submodule update nicely
Note March 2013:
As mentioned in “git submodule tracking latest“, a submodule now (git1.8.2) can track a branch.
See “
git submodule update --remotevsgit pull“.MindTooth‘s answer illustrate a manual update (without local configuration):
In both cases, that will change the submodules references (the gitlink, a special entry in the parent repo index), and you will need to add, commit and push said references from the main repo.
Next time you will clone that parent repo, it will populate the submodules to reflect those new SHA1 references.
The rest of this answer details the classic submodule feature (reference to a fixed commit, which is the all point behind the notion of a submodule).
So, to answer your questions:
You can create a branch and push modifications.
WARNING (from Git Submodule Tutorial): Always publish (push) the submodule change before publishing (push) the change to the superproject that references it. If you forget to publish the submodule change, others won’t be able to clone the repository.
The page “Understanding Submodules” can help
These together triangulate a specific revision of a specific repository which is checked out into a specific location in your project.
From the git submodule page
100% correct: you cannot modify a submodule, only refer to one of its commits.
This is why, when you do modify a submodule from within the main project, you:
A submodule enables you to have a component-based approach development, where the main project only refers to specific commits of other components (here “other Git repositories declared as sub-modules”).
A submodule is a marker (commit) to another Git repository which is not bound by the main project development cycle: it (the “other” Git repo) can evolves independently.
It is up to the main project to pick from that other repo whatever commit it needs.
However, should you want to, out of convenience, modify one of those submodules directly from your main project, Git allows you to do that, provided you first publish those submodule modifications to its original Git repo, and then commit your main project refering to a new version of said submodule.
But the main idea remains: referencing specific components which:
The list of specific commits you are refering to in your main project defines your configuration (this is what Configuration Management is all about, englobing mere Version Control System)
If a component could really be developed at the same time as your main project (because any modification on the main project would involve modifying the sub-directory, and vice-versa), then it would be a “submodule” no more, but a subtree merge (also presented in the question Transferring legacy code base from cvs to distributed repository), linking the history of the two Git repo together.
Does that help understanding the true nature of Git Submodules?