git-submodule(1)


NAME

   git-submodule - Initialize, update or inspect submodules

SYNOPSIS

   git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>]
                 [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]
   git submodule [--quiet] status [--cached] [--recursive] [--] [<path>...]
   git submodule [--quiet] init [--] [<path>...]
   git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>...)
   git submodule [--quiet] update [--init] [--remote] [-N|--no-fetch]
                 [--[no-]recommend-shallow] [-f|--force] [--rebase|--merge]
                 [--reference <repository>] [--depth <depth>] [--recursive]
                 [--jobs <n>] [--] [<path>...]
   git submodule [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
                 [commit] [--] [<path>...]
   git submodule [--quiet] foreach [--recursive] <command>
   git submodule [--quiet] sync [--recursive] [--] [<path>...]

DESCRIPTION

   Inspects, updates and manages submodules.

   A submodule allows you to keep another Git repository in a subdirectory
   of your repository. The other repository has its own history, which
   does not interfere with the history of the current repository. This can
   be used to have external dependencies such as third party libraries for
   example.

   When cloning or pulling a repository containing submodules however,
   these will not be checked out by default; the init and update
   subcommands will maintain submodules checked out and at appropriate
   revision in your working tree.

   Submodules are composed from a so-called gitlink tree entry in the main
   repository that refers to a particular commit object within the inner
   repository that is completely separate. A record in the .gitmodules
   (see gitmodules(5)) file at the root of the source tree assigns a
   logical name to the submodule and describes the default URL the
   submodule shall be cloned from. The logical name can be used for
   overriding this URL within your local repository configuration (see
   submodule init).

   Submodules are not to be confused with remotes, which are other
   repositories of the same project; submodules are meant for different
   projects you would like to make part of your source tree, while the
   history of the two projects still stays completely independent and you
   cannot modify the contents of the submodule from within the main
   project. If you want to merge the project histories and want to treat
   the aggregated whole as a single project from then on, you may want to
   add a remote for the other project and use the subtree merge strategy,
   instead of treating the other project as a submodule. Directories that
   come from both projects can be cloned and checked out as a whole if you
   choose to go that route.

COMMANDS

   add
       Add the given repository as a submodule at the given path to the
       changeset to be committed next to the current project: the current
       project is termed the "superproject".

       This requires at least one argument: <repository>. The optional
       argument <path> is the relative location for the cloned submodule
       to exist in the superproject. If <path> is not given, the
       "humanish" part of the source repository is used ("repo" for
       "/path/to/repo.git" and "foo" for "host.xz:foo/.git"). The <path>
       is also used as the submodule's logical name in its configuration
       entries unless --name is used to specify a logical name.

       <repository> is the URL of the new submodule's origin repository.
       This may be either an absolute URL, or (if it begins with ./ or
       ../), the location relative to the superproject's origin repository
       (Please note that to specify a repository foo.git which is located
       right next to a superproject bar.git, you'll have to use ../foo.git
       instead of ./foo.git - as one might expect when following the rules
       for relative URLs - because the evaluation of relative URLs in Git
       is identical to that of relative directories). If the superproject
       doesn't have an origin configured the superproject is its own
       authoritative upstream and the current working directory is used
       instead.

       <path> is the relative location for the cloned submodule to exist
       in the superproject. If <path> does not exist, then the submodule
       is created by cloning from the named URL. If <path> does exist and
       is already a valid Git repository, then this is added to the
       changeset without cloning. This second form is provided to ease
       creating a new submodule from scratch, and presumes the user will
       later push the submodule to the given URL.

       In either case, the given URL is recorded into .gitmodules for use
       by subsequent users cloning the superproject. If the URL is given
       relative to the superproject's repository, the presumption is the
       superproject and submodule repositories will be kept together in
       the same relative location, and only the superproject's URL needs
       to be provided: git-submodule will correctly locate the submodule
       using the relative URL in .gitmodules.

   status
       Show the status of the submodules. This will print the SHA-1 of the
       currently checked out commit for each submodule, along with the
       submodule path and the output of git describe for the SHA-1. Each
       SHA-1 will be prefixed with - if the submodule is not initialized,
       + if the currently checked out submodule commit does not match the
       SHA-1 found in the index of the containing repository and U if the
       submodule has merge conflicts.

       If --recursive is specified, this command will recurse into nested
       submodules, and show their status as well.

       If you are only interested in changes of the currently initialized
       submodules with respect to the commit recorded in the index or the
       HEAD, git-status(1) and git-diff(1) will provide that information
       too (and can also report changes to a submodule's work tree).

   init
       Initialize the submodules recorded in the index (which were added
       and committed elsewhere) by copying submodule names and urls from
       .gitmodules to .git/config. Optional <path> arguments limit which
       submodules will be initialized. It will also copy the value of
       submodule.$name.update into .git/config. The key used in
       .git/config is submodule.$name.url. This command does not alter
       existing information in .git/config. You can then customize the
       submodule clone URLs in .git/config for your local setup and
       proceed to git submodule update; you can also just use git
       submodule update --init without the explicit init step if you do
       not intend to customize any submodule locations.

   deinit
       Unregister the given submodules, i.e. remove the whole
       submodule.$name section from .git/config together with their work
       tree. Further calls to git submodule update, git submodule foreach
       and git submodule sync will skip any unregistered submodules until
       they are initialized again, so use this command if you don't want
       to have a local checkout of the submodule in your working tree
       anymore. If you really want to remove a submodule from the
       repository and commit that use git-rm(1) instead.

       When the command is run without pathspec, it errors out, instead of
       deinit-ing everything, to prevent mistakes.

       If --force is specified, the submodule's working tree will be
       removed even if it contains local modifications.

   update
       Update the registered submodules to match what the superproject
       expects by cloning missing submodules and updating the working tree
       of the submodules. The "updating" can be done in several ways
       depending on command line options and the value of
       submodule.<name>.update configuration variable. Supported update
       procedures are:

       checkout
           the commit recorded in the superproject will be checked out in
           the submodule on a detached HEAD. This is done when --checkout
           option is given, or no option is given, and
           submodule.<name>.update is unset, or if it is set to checkout.

           If --force is specified, the submodule will be checked out
           (using git checkout --force if appropriate), even if the commit
           specified in the index of the containing repository already
           matches the commit checked out in the submodule.

       rebase
           the current branch of the submodule will be rebased onto the
           commit recorded in the superproject. This is done when --rebase
           option is given, or no option is given, and
           submodule.<name>.update is set to rebase.

       merge
           the commit recorded in the superproject will be merged into the
           current branch in the submodule. This is done when --merge
           option is given, or no option is given, and
           submodule.<name>.update is set to merge.

       custom command
           arbitrary shell command that takes a single argument (the sha1
           of the commit recorded in the superproject) is executed. This
           is done when no option is given, and submodule.<name>.update
           has the form of !command.

       When no option is given and submodule.<name>.update is set to none,
       the submodule is not updated.

       If the submodule is not yet initialized, and you just want to use
       the setting as stored in .gitmodules, you can automatically
       initialize the submodule with the --init option.

       If --recursive is specified, this command will recurse into the
       registered submodules, and update any nested submodules within.

   summary
       Show commit summary between the given commit (defaults to HEAD) and
       working tree/index. For a submodule in question, a series of
       commits in the submodule between the given super project commit and
       the index or working tree (switched by --cached) are shown. If the
       option --files is given, show the series of commits in the
       submodule between the index of the super project and the working
       tree of the submodule (this option doesn't allow to use the
       --cached option or to provide an explicit commit).

       Using the --submodule=log option with git-diff(1) will provide that
       information too.

   foreach
       Evaluates an arbitrary shell command in each checked out submodule.
       The command has access to the variables $name, $path, $sha1 and
       $toplevel: $name is the name of the relevant submodule section in
       .gitmodules, $path is the name of the submodule directory relative
       to the superproject, $sha1 is the commit as recorded in the
       superproject, and $toplevel is the absolute path to the top-level
       of the superproject. Any submodules defined in the superproject but
       not checked out are ignored by this command. Unless given --quiet,
       foreach prints the name of each submodule before evaluating the
       command. If --recursive is given, submodules are traversed
       recursively (i.e. the given shell command is evaluated in nested
       submodules as well). A non-zero return from the command in any
       submodule causes the processing to terminate. This can be
       overridden by adding || : to the end of the command.

       As an example, git submodule foreach 'echo $path `git rev-parse
       HEAD`' will show the path and currently checked out commit for each
       submodule.

   sync
       Synchronizes submodules' remote URL configuration setting to the
       value specified in .gitmodules. It will only affect those
       submodules which already have a URL entry in .git/config (that is
       the case when they are initialized or freshly added). This is
       useful when submodule URLs change upstream and you need to update
       your local repositories accordingly.

       "git submodule sync" synchronizes all submodules while "git
       submodule sync -- A" synchronizes submodule "A" only.

       If --recursive is specified, this command will recurse into the
       registered submodules, and sync any nested submodules within.

OPTIONS

   -q, --quiet
       Only print error messages.

   --all
       This option is only valid for the deinit command. Unregister all
       submodules in the working tree.

   -b, --branch
       Branch of repository to add as submodule. The name of the branch is
       recorded as submodule.<name>.branch in .gitmodules for update
       --remote. A special value of .  is used to indicate that the name
       of the branch in the submodule should be the same name as the
       current branch in the current repository.

   -f, --force
       This option is only valid for add, deinit and update commands. When
       running add, allow adding an otherwise ignored submodule path. When
       running deinit the submodule working trees will be removed even if
       they contain local changes. When running update (only effective
       with the checkout procedure), throw away local changes in
       submodules when switching to a different commit; and always run a
       checkout operation in the submodule, even if the commit listed in
       the index of the containing repository matches the commit checked
       out in the submodule.

   --cached
       This option is only valid for status and summary commands. These
       commands typically use the commit found in the submodule HEAD, but
       with this option, the commit stored in the index is used instead.

   --files
       This option is only valid for the summary command. This command
       compares the commit in the index with that in the submodule HEAD
       when this option is used.

   -n, --summary-limit
       This option is only valid for the summary command. Limit the
       summary size (number of commits shown in total). Giving 0 will
       disable the summary; a negative number means unlimited (the
       default). This limit only applies to modified submodules. The size
       is always limited to 1 for added/deleted/typechanged submodules.

   --remote
       This option is only valid for the update command. Instead of using
       the superproject's recorded SHA-1 to update the submodule, use the
       status of the submodule's remote-tracking branch. The remote used
       is branch's remote (branch.<name>.remote), defaulting to origin.
       The remote branch used defaults to master, but the branch name may
       be overridden by setting the submodule.<name>.branch option in
       either .gitmodules or .git/config (with .git/config taking
       precedence).

       This works for any of the supported update procedures (--checkout,
       --rebase, etc.). The only change is the source of the target SHA-1.
       For example, submodule update --remote --merge will merge upstream
       submodule changes into the submodules, while submodule update
       --merge will merge superproject gitlink changes into the
       submodules.

       In order to ensure a current tracking branch state, update --remote
       fetches the submodule's remote repository before calculating the
       SHA-1. If you don't want to fetch, you should use submodule update
       --remote --no-fetch.

       Use this option to integrate changes from the upstream subproject
       with your submodule's current HEAD. Alternatively, you can run git
       pull from the submodule, which is equivalent except for the remote
       branch name: update --remote uses the default upstream repository
       and submodule.<name>.branch, while git pull uses the submodule's
       branch.<name>.merge. Prefer submodule.<name>.branch if you want to
       distribute the default upstream branch with the superproject and
       branch.<name>.merge if you want a more native feel while working in
       the submodule itself.

   -N, --no-fetch
       This option is only valid for the update command. Don't fetch new
       objects from the remote site.

   --checkout
       This option is only valid for the update command. Checkout the
       commit recorded in the superproject on a detached HEAD in the
       submodule. This is the default behavior, the main use of this
       option is to override submodule.$name.update when set to a value
       other than checkout. If the key submodule.$name.update is either
       not explicitly set or set to checkout, this option is implicit.

   --merge
       This option is only valid for the update command. Merge the commit
       recorded in the superproject into the current branch of the
       submodule. If this option is given, the submodule's HEAD will not
       be detached. If a merge failure prevents this process, you will
       have to resolve the resulting conflicts within the submodule with
       the usual conflict resolution tools. If the key
       submodule.$name.update is set to merge, this option is implicit.

   --rebase
       This option is only valid for the update command. Rebase the
       current branch onto the commit recorded in the superproject. If
       this option is given, the submodule's HEAD will not be detached. If
       a merge failure prevents this process, you will have to resolve
       these failures with git-rebase(1). If the key
       submodule.$name.update is set to rebase, this option is implicit.

   --init
       This option is only valid for the update command. Initialize all
       submodules for which "git submodule init" has not been called so
       far before updating.

   --name
       This option is only valid for the add command. It sets the
       submodule's name to the given string instead of defaulting to its
       path. The name must be valid as a directory name and may not end
       with a /.

   --reference <repository>
       This option is only valid for add and update commands. These
       commands sometimes need to clone a remote repository. In this case,
       this option will be passed to the git-clone(1) command.

       NOTE: Do not use this option unless you have read the note for git-
       clone(1)'s --reference and --shared options carefully.

   --recursive
       This option is only valid for foreach, update, status and sync
       commands. Traverse submodules recursively. The operation is
       performed not only in the submodules of the current repo, but also
       in any nested submodules inside those submodules (and so on).

   --depth
       This option is valid for add and update commands. Create a shallow
       clone with a history truncated to the specified number of
       revisions. See git-clone(1)

   --[no-]recommend-shallow
       This option is only valid for the update command. The initial clone
       of a submodule will use the recommended submodule.<name>.shallow as
       provided by the .gitmodules file by default. To ignore the
       suggestions use --no-recommend-shallow.

   -j <n>, --jobs <n>
       This option is only valid for the update command. Clone new
       submodules in parallel with as many jobs. Defaults to the
       submodule.fetchJobs option.

   <path>...
       Paths to submodule(s). When specified this will restrict the
       command to only operate on the submodules found at the specified
       paths. (This argument is required with add).

FILES

   When initializing submodules, a .gitmodules file in the top-level
   directory of the containing repository is used to find the url of each
   submodule. This file should be formatted in the same way as
   $GIT_DIR/config. The key to each submodule url is
   "submodule.$name.url". See gitmodules(5) for details.

GIT

   Part of the git(1) suite





Opportunity


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.





Free Software


Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.


Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.





Free Books


The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.


Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.





Education


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.


Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.