diff --git a/docs/Submodules.md b/docs/Submodules.md new file mode 100644 index 0000000000..501e7884d3 --- /dev/null +++ b/docs/Submodules.md @@ -0,0 +1,84 @@ +Submodules +========== + +This repository composes ASP.NET Core repos from a collection of many submodules. +Working with submodules in git requires using commands not used in a normal git workflow. +Here are some tips for working with submodules. + +For full information, see the [official docs for git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules). + +## Fundamental concept + +The parent repo (aspnet/Universe) stores two pieces of info about each submodule. + +1. Where to clone the submodule from. This is stored in the .gitmodules file +2. The commit hash of the submodule to use. + +This means you cannot commit a submodule's branch or a tag to the parent repo. +Other info may appear in the .gitmodules file, but it is only used when attempting to +[update a submodule.](#updating-submodules) + +## Cloning + +By default, submodules will not be present. Use `--recursive` to clone all submodules. + + git clone https://github.com/aspnet/Universe.git --recursive + +If you have already cloned, run this to initialize all submodules. + + git submodule update --init + +## Pulling updates + +When you execute `git pull`, submodules do not automatically snap to the version +used in new commits of the parent repo. Update all submodules to match the parent repo's +expected version by running this command. + + git submodule update + +## Executing a command on each submodule + + git submodule foreach '' + +For example, to clean and reset each submodule: + + git submodule foreach 'git reset --hard; git clean -xfd' + +## Updating submodules + +Updating all submodules to newer versions can be done like this. + + git submodule update --remote + +Updating just one subumodule. + + git submodule update --remote modules/EntityFrameworkCore/ + +This uses the remote url and branch info configuration stored in .gitmodules to pull new commits. +This does not guarantee the commit is going to be a fast-forward commit. + +## Diff + +You can see which commits have changed in submodules from the last parent repo commit by adding `--submodule` to git-diff. + + git diff --submodule + +## Saving an update to a submodule + +To move the parent repo to use a new commit, you must create a commit in the parent repo +that contains the new commit. + + git submodule update --remote modules/KestrelHttpServer/ + git add modules/KestrelhttpServer/ + git commit -m "Update Kestrel to latest version" + +## PowerShell is slow in aspnet/Universe + +Many users have post-git, and extension that shows git status on the prompt line. Because `git status` with submodules +on Windows is very slow, it can make PowerShell unbearable to use. + +To workaround this, disable checking git-status for each prompt. +```ps1 +$GitPromptSettings.EnableFileStatus = $false +``` +You can disable this permanently by adding to your `$PROFILE` file. (`notepad $PROFILE`)