As far as I understand, if you add a submodule in git, then the main repo contains a pointer to a certain commit of the submodule.
Is there any way to see to which commit the main repo points at for a specific submodule, without checking out the code of the submodule?
Sure; there are several ways:
git ls-tree <commit> <relative path to submodule>
git ls-tree <commit>:<absolute path to parent of submodule>
git ls-tree <commit>:./<relative path to parent of submodule>
git ls-tree -r <commit> <relative path to parent of submodule>
The first is easiest by far for checking a single submodule.
The second/third is easiest if you want to check several submodules contained in the same directory, but you don't want to recurse into any other subdirectories that are not submodules. (The :
syntax uses the top level of the repository as its reference point by default, rather than your current working directory, so be sure to include the ./
prefix if you're way in the depths of your repo right now.)
The fourth is easiest if you have a lot of submodules, and only submodules, in a single directory.
Examples:
git ls-tree HEAD src/thirdparty/libfoo
shows the submodule and nothing else.git ls-tree HEAD:src/thirdparty
gives you everything directly below src/thirdparty
, including your submodule src/thirdparty/libfoo
.git ls-tree -r HEAD src/thirdparty
gives you everything directly below src/thirdparty
, including your submodule src/thirdparty/libfoo
, but will also recurse into src/thirdparty/docs
which is actually a regular directory in your repo.git ls-tree -r HEAD
lists absolutely everything in your repo, including submodules.Submodules will show up as type commit
(as opposed to the usual blob
or tree
).