1. Git Submodules

1.1. Clone with submodules

$ git clone --recursive

1.2. Add submodule

$ git submodule add https://github.com/AstroTech/workshop-git.git contrib/
Cloning into '/home/devops/contrib'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 377 (delta 4), reused 26 (delta 2), pack-reused 348
Receiving objects: 100% (377/377), 40.81 MiB | 3.77 MiB/s, done.
Resolving deltas: 100% (141/141), done.

$ ls contrib
LICENSE.txt             _references             requirements.txt
README.rst              _static                 setup.cfg
_img                    conf.py                 setup.py
_new_img                index.rst               versioning
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitmodules
        new file:   contrib
$ cat .gitmodules
[submodule "contrib"]
        path = contrib
        url = https://github.com/AstroTech/workshop-git.git

1.3. Update

$ cd contrib

$ git pull
Already up to date.
Current branch master is up to date.

$ cd ..

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitmodules
        new file:   contrib

$ git commit
Aborting commit due to empty commit message.

$ git commit -am "Add submodule"
[master 4140967] Add submodule
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 contrib

$ git push

1.4. Remove

$ git rm -fr contrib .gitmodules
rm 'contrib'

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    .gitmodules
        deleted:    contrib