-
Notifications
You must be signed in to change notification settings - Fork 2
Home
Welcome to the git-submod-enhancements wiki!
As Dscho put it, submodules are the “neglected ugly duckling” of git. Time to change that …
Here we collect ideas, design descriptions of certain parts of the submodule implementation. If you want to help out, this is a good place to search for low hanging fruits to get started. The topics described here vary in complexity. If you are unsure about the complexity feel free to ask on the mailing list.
The started but stalled issues are also a good place to dive in, since they already have some existing code modifications, which you can follow and use to familiarize yourself with submodule part of the code base.
- Add configuration options (global and per repo) to set the default of
git push --recurse-submodules
- Recursive submodule checkout: teach all work tree manipulating commands to update the submodule work trees according to the commit recorded in the superproject. (branch on github )
- Teach
git fetch
to also fetch commits for submodule not currently in the work tree into .git/modules/ (branch on github ). - Submodule support for rev-parse by Phil Hord
-
Stalled: Add recurse submodule functionality to
git archive
(thread on mailinglist ) -
Stalled: Teach
grep
the--recursive
option (thread on mailinglist)
- Add functionality to move the .git directory of a submodule into the .git/modules directory of the superproject (either by adding a new
git submodule
command or by providing a script in contrib/) - Add a git-config aware merge driver and make it the default for .gitmodules
- Attempt a 3-way merge when
git mv
,git rm
orgit submodule add
want to change a .gitmodules file which has unstaged changes - Add configuration options (per submodule) to set the default of
git push --recurse-submodules
- Add a tutorial explaining the different use cases and the configuration settings which suit them.
- Add an option to
git submodule add
to move the .git directory of a local repository to be added as submodule into the .git/modules directory of the superproject - Add means to specify which submodules shall be populated on clone (which I’d like to implement by teaching
git fetch
to create submodule repos in .git/modules, recursive checkout will then do the rest) - Showing that a submodule has a HEAD not on any branch in the
git status
of the superproject -
gitk
: Add popup menu for submodules to see the detailed history of changes - Teach
git prune
the--recurse-submodules
option (and maybe honour the same default and optionsgit fetch
uses) - Better support for displaying merge conflicts of submodules
-
git gui
: Add submodule menu for adding and fetching submodules -
git status
should callgit diff --submodule --ignore-submodules=dirty
instead ofgit submodule summary
for providing a submodule summary when configured to do so. - Other commands that could benefit from a
--recurse-submodules
option:archive
,branch
,clean
,commit
,revert
,tag
. - To enable history rewriting
git filter-branch
could write a list of rewritten commits which can then be used to update submodule commits in a superproject. - Much more documentation: E.g. update description in Documentation/user-manual.txt, Extend the pro-git book, Write blog posts, …
In the long run, git-submodule.sh should be converted to a rather simple wrapper script around core Git functionality, as more and more of that is implemented in the git core. For that we need extensive submodule update tests. Johan Herland has started a collection .
- Cherry picking across submodule creation fails even if the cherry pick doesn’t touch any file in the submodules path
-
git submodule add
doesn’t record the URL in .git/config when the submodule path doesn’t exist -
git submodule add
happily stages any unstaged modifications of the .gitmodules file together with the new section while it should error out telling the user to stash them (at least unless it attempts the 3-way merge described in the “Issues still to be tackled” paragraph) - E.g.
git log <submodule>/
andgit diff <rev> <submodule>/
do not produce any output while dropping the ‘/’ at the end makes them work as expected. -
git add
does not honour the submodule.<name>.ignore settings -
git submodule add
messes up paths from nested submodules, see (thread on mailing list) -
git commit
can be cautious about submodule related commits. That is if a commit contains a change to the .gitmodules file, make sure that the corresponding gitlink is present (either already in the tree or newly added). IIUC Jonathan correctly a submodule which is configured in .gitmodules, but not present as a gitlink is considered broken, which we may want to avoid in the first place. When implementing this, we need to take care of historical mistakes being handled correctly as well as a flag to commit, which overwrites the potential warning. The gitmodules file unlike other in-tree configuration files (.gitignore, .gitattributes, .mailmap) have a 1:1 mapping so the existence of the gitlink is strongly expected. (Counter example with .gitignore: Ignoring *.exe doesn’t expect any .exe file to be there). I imagine this to roughly work as:
$ git add .gitmodules
$ git commit -m "add submodule to .gitmodules, but not as gitlink"
Warning: Not committing as this would break submodule consistency. Use
--force-submodules to commit the broken submodule state.
$ echo $?
1 # fail
$ git commit --force-submodules -m "add submodule to .gitmodules, but not as gitlink"
$ echo $?
0 # Success