Re: [PATCHv2] submodules: overhaul documentation
From: Jonathan Tan <hidden>
Date: 2017-06-21 03:45:52
Thanks, this looks like a good explanation. Some more nits, but overall I feel like I understand this and have learned something from it. On Tue, Jun 20, 2017 at 3:56 PM, Stefan Beller [off-list ref] wrote:
+A submodule is another Git repository tracked inside a repository. +The tracked repository has its own history, which does not +interfere with the history of the current repository. + +It consists of a tracking subdirectory in the working directory, +a 'gitlink' in the working tree and an entry in the `.gitmodules`
Probably should be `gitlink` (the special quotes), and (optional) s/`gitlink`/`gitlink` object/ because it might not be apparent that gitlink is a type of object.
+file (see linkgit:gitmodules[5]) at the root of the source tree.
After reading below, maybe we should mention the Git directory in $GIT_DIR/modules/<submodule name> as part of what a submodule consists of too.
+The tracking subdirectory appears in the main repositorys working
s/repositorys/repository's/ (apostrophe is also missing in some other places below)
+tree at the point where the submodules gitlink is tracked in the +tree. It is empty when the submodule is not populated, otherwise +it contains the content of the submodule repository. +The main repository is often referred to as superproject. + +The gitlink contains the object name of a particular commit +of the submodule. + +The `.gitmodules` file establishes a relationship between the +path, which is where the gitlink is in the tree, and the logical +name, which is used for the location of the submodules git +directory. The `.gitmodules` file has the same syntax as the +$Git_DIR/config file and the mapping of path to name
Capitalization of $GIT_DIR
+is done via setting `submodule.<name value>.path = <path value>`.
(Optional) I would prefer <name> and <path> to be consistent with the following paragraph.
+The submodules git directory is found in in the main repositories +'$GIT_DIR/modules/<name>' or inside the tracking subdirectory. + +Submodules can be used for at least two different use cases: + +1. Using another project while maintaining independent history. + Submodules allow you to contain the working tree of another project + within your own working tree while keeping the history of both + projects separate. Also, since submodules are fixed to a an arbitrary + version, the other project can be independently developed without + affecting the superproject, allowing the superproject project to + fix itself to new versions only whenever desired. + +2. Splitting a (logically single) project into multiple + repositories and tying them back together. This can be used to + overcome current limitations of Gits implementation to have + finer grained access: + +* Size of the git repository + In its current form Git scales up poorly for very large repositories that + change a lot, as the history grows very large. + However you can also use submodules to e.g. hold large binary assets + and these repositories are then shallowly cloned such that you do not + have a large history locally. + +* Transfer size + In its current form Git requires the whole working tree present. It + does not allow partial trees to be transferred in fetch or clone. + +* Access control + By restricting user access to submodules, this can be used to implement + read/write policies for different users.
The bullet points should probably be indented more. [snip]
+Deleting a submodule +-------------------- + +Deleting a submodule can happen on different levels: + +1) Removing it from the local working tree without tampering with + the history of the superproject. + +You may no longer need the submodule, but still want to keep it recorded +in the superproject history as others may have use for it. The command +`git submodule deinit <submodule path>` will remove any configuration +entries from the config file, such that the submodule becomes
s=config=$GIT_DIR/config= (since there are multiple relevant config files)
+uninitialized. The tracking directory in the superprojects working +tree that holds the submodules working directory is emptied. +This step can be undone via `git submodule init`. + +2) Remove it from history: +-- + git rm <submodule path> + git commit +-- +This removes the submodules gitlink from the superprojects tree, as well +as removing the entries from the `.gitmodules` file, but keeps the +local configuration for the submodule. This can be undone using `git revert`. + + +3) Remove the submodules git directory: + +When you also want to free up the disk space that the submodules git +directory uses, you have to delete it manually as this +step cannot be undone using git tools. It is found in `$GIT_DIR/modules`.