Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
GIT-SUBMODULE(1)		   Git Manual			GIT-SUBMODULE(1)

NAME
     git-submodule - Initialize, update or inspect submodules

SYNOPSIS
     git submodule [--quiet] [--cached]
     git submodule [--quiet] add [<options>] [--] <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 [<options>] [--] [<path>...]
     git submodule [--quiet] set-branch [<options>] [--] <path>
     git submodule [--quiet] set-url [--] <path> <newurl>
     git submodule [--quiet] summary [<options>] [--] [<path>...]
     git submodule [--quiet] foreach [--recursive] <command>
     git submodule [--quiet] sync [--recursive] [--] [<path>...]
     git submodule [--quiet] absorbgitdirs [--] [<path>...]

DESCRIPTION
     Inspects, updates and manages submodules.

     For more information about submodules, see gitsubmodules(7).

COMMANDS
     With no arguments, shows the status of existing submodules. Several subcom-
     mands are available to perform operations on the submodules.

     add [-b <branch>] [-f | --force] [--name <name>] [--reference <repository>]
     [--ref-format <format>] [--depth <depth>] [--] <repository> [<path>]
	 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".

	 <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  default  remote 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 in-
	 stead	of  ./foo.git - as one might expect when following the rules for
	 relative URLs - because the evaluation of relative URLs in Git is iden-
	 tical to that of relative directories).

	 The default remote is the remote of the remote-tracking branch  of  the
	 current branch. If no such remote-tracking branch exists or the HEAD is
	 detached,  origin is assumed to be the default remote. If the superpro-
	 ject doesn't have a default remote configured the superproject  is  its
	 own  authoritative  upstream  and the current working directory is used
	 instead.

	 The optional argument <path> is the relative location	for  the  cloned
	 submodule  to	exist  in  the superproject. If <path> is not given, the
	 canonical  part  of  the  source   repository	 is   used   (repo   for
	 /path/to/repo.git  and  foo for host.xz:foo/.git). If <path> exists and
	 is already a valid Git repository, then it is staged for commit without
	 cloning. The <path> is also used as the submodule's logical name in its
	 configuration entries unless --name <name> is used to specify a logical
	 name.

	 The given URL is recorded into .gitmodules for use by subsequent  users
	 cloning the superproject. If the URL is given relative to the superpro-
	 ject'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.

	 If --ref-format <format> is specified, the ref storage format of  newly
	 cloned submodules will be set accordingly.

     status [--cached] [--recursive] [--] [<path>...]
	 Show  the  status  of	the submodules. This will print the SHA-1 of the
	 currently checked out commit for each submodule, along with the submod-
	 ule path and the output of git-describe(1) for the  SHA-1.  Each  SHA-1
	 will possibly 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  --cached  is  specified,  this command will instead print the SHA-1
	 recorded in the superproject for each submodule.

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

	 If you are only interested in changes of the currently initialized sub-
	 modules 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 [--] [<path>...]
	 Initialize the submodules recorded in the index (which were  added  and
	 committed elsewhere) by setting submodule.$name.url in .git/config, us-
	 ing the same setting from .gitmodules as a template. If the URL is rel-
	 ative, it will be resolved using the default remote. If there is no de-
	 fault remote, the current repository will be assumed to be upstream.

	 Optional  <path>  arguments limit which submodules will be initialized.
	 If no path is specified and submodule.active has been configured,  sub-
	 modules configured to be active will be initialized, otherwise all sub-
	 modules are initialized.

	 It  will  also  copy the value of submodule.$name.update, if present in
	 the .gitmodules file, to .git/config, but (1) this command does not al-
	 ter existing information in .git/config, and (2) submodule.$name.update
	 that is set to a custom command is not copied for security reasons.

	 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.

	 See the add subcommand for the definition of default remote.

     deinit [-f | --force] (--all|[--] <path>...)
	 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.

	 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.

	 If you really want to remove a submodule from the repository and commit
	 that use git-rm(1) instead. See gitsubmodules(7) for removal options.

     update [--init] [--remote] [-N | --no-fetch] [--[no-]recommend-shallow] [-f
     | --force] [--checkout |  --rebase  |  --merge]  [--reference=<repository>]
     [--ref-format=<format>]   [--depth=<depth>]   [--recursive]   [--jobs  <n>]
     [--[no-]single-branch] [--filter=<filter-spec>] [--] [<path>...]
	 Update the registered submodules to match what the superproject expects
	 by cloning missing submodules, fetching missing commits  in  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. The command line option
	 takes precedence over the configuration variable. If neither is  given,
	 a  checkout is performed. (note: what is in .gitmodules file is irrele-
	 vant at this point; see git submodule init above for how .gitmodules is
	 used). The update procedures supported both from the  command	line  as
	 well as through the submodule.<name>.update configuration are:

	 checkout
	     the  commit recorded in the superproject will be checked out in the
	     submodule on a detached HEAD.

	     If --force is specified, the submodule will be checked  out  (using
	     git checkout --force), 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.

	 merge
	     the  commit  recorded  in	the superproject will be merged into the
	     current branch in the submodule.

	 The following update procedures have additional limitations:

	 !<custom-command>
	     mechanism for running arbitrary commands with the commit ID  as  an
	     argument.	Specifically,  if the submodule.<name>.update configura-
	     tion variable is set to !<custom-command>, the object name  of  the
	     commit  recorded  in the superproject for the submodule is appended
	     to the <custom-command> string and executed. Note that this  mecha-
	     nism  is  not  supported  in the .gitmodules file or on the command
	     line.

	 none
	     the submodule is not updated. This update procedure is not  allowed
	     on the command line.

	 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 regis-
	 tered submodules, and update any nested submodules within.

	 If --ref-format <format> is specified, the ref storage format of  newly
	 cloned submodules will be set accordingly.

	 If  --filter <filter-spec> is specified, the given partial clone filter
	 will be applied to the submodule. See git-rev-list(1)	for  details  on
	 filter specifications.

     set-branch  (-b|--branch)	<branch>  [--] <path>, set-branch (-d|--default)
     [--] <path>
	 Set the default remote tracking branch for the submodule. The	--branch
	 option  allows  the remote branch to be specified. The --default option
	 removes the submodule.<name>.branch configuration key, which causes the
	 tracking branch to default to the remote HEAD.

     set-url [--] <path> <newurl>
	 Set the URL of the specified submodule to <newurl>. Then, it will auto-
	 matically synchronize the submodule's new remote URL configuration.

     summary [--cached	|  --files]  [(-n|--summary-limit)  <n>]  [commit]  [--]
     [<path>...]
	 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 com-
	 mit).

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

     foreach [--recursive] <command>
	 Evaluate an arbitrary shell <command> in each	checked  out  submodule.
	 The  command has access to the variables $name, $sm_path, $displaypath,
	 $sha1 and $toplevel:

	 $name
	     the name of the relevant submodule section in .gitmodules

	 $sm_path
	     the path of the submodule as recorded in the immediate superproject

	 $displaypath
	     the relative path from the current working directory to the submod-
	     ules root directory

	 $sha1
	     the commit as recorded in the immediate superproject

	 $toplevel
	     the absolute path to the top-level of the immediate superproject.

	 Note that to avoid conflicts with $PATH on Windows, the $path	variable
	 is  now  a  deprecated synonym of $sm_path variable. Any submodules de-
	 fined in the superproject but not checked out are ignored by this  com-
	 mand.	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,  the	command  below	will show the path and currently
	 checked out commit for each submodule:

	     git submodule foreach 'echo $sm_path `git rev-parse HEAD`'

     sync [--recursive] [--] [<path>...]
	 Synchronize 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 accord-
	 ingly.

	 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  regis-
	 tered submodules, and sync any nested submodules within.

     absorbgitdirs
	 If a git directory of a submodule is inside the submodule, move the git
	 directory  of	the  submodule	into its superproject's $GIT_DIR/modules
	 path and then connect the git directory and its  working  directory  by
	 setting  the  core.worktree  and adding a .git file pointing to the git
	 directory embedded in the superprojects git directory.

	 A repository that was cloned independently and later added as a submod-
	 ule or old setups have the submodules git directory inside the  submod-
	 ule instead of embedded into the superprojects git directory.

	 This command is recursive by default.

OPTIONS
     -q, --quiet
	 Only print error messages.

     --progress
	 Report  progress status on the standard error stream by default when it
	 is attached to a terminal, unless -q is  specified.  This  flag  forces
	 progress  status even if the standard error stream is not directed to a
	 terminal. It is only valid for add and update commands.

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

     -b<branch>, --branch=<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 cur-
	 rent repository. If the option is not specified, it defaults to the re-
	 mote HEAD.

     -f, --force
	 Force the command to proceed, even if it would otherwise fail. This op-
	 tion is only valid for add, deinit and update commands.

	 add
	     allow adding an otherwise ignored submodule path.	This  option  is
	     also  used  to  bypass a check that the submodule's name is not al-
	     ready in use. By default, git submodule add will fail if  the  pro-
	     posed  name  (which is derived from the path) is already registered
	     for another submodule in the repository. Using --force  allows  the
	     command to proceed by automatically generating a unique name by ap-
	     pending  a  number  to  the  conflicting name (e.g., if a submodule
	     named child exists, it will try child1, and so on).

	 deinit
	     the submodule working trees will be removed even  if  they  contain
	     local changes.

	 update
	     (only  effective  with  the  checkout  procedure), throw away local
	     changes in submodules when switching to a different commit; and al-
	     ways 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
	 Use  the index to determine the commit instead of the HEAD. This option
	 is only valid for status and summary commands.

     --files
	 Make the summary command compare the commit in the index with	that  in
	 the submodule HEAD.

     -n<n>, --summary-limit=<n>
	 Limit	the summary size (number of commits shown in total) to <n>. Giv-
	 ing 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
	 Instead of using the superproject's recorded SHA-1 to update  the  sub-
	 module,  use the status of the submodule's remote-tracking branch. This
	 option is only valid  for  the  update  command.  The	remote	used  is
	 branch's  remote  (branch.<name>.remote), defaulting to origin. The re-
	 mote branch used defaults to the remote HEAD, 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 submod-
	 ule 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 submod-
	 ule.<name>.branch,   while    git    pull    uses    the    submodule's
	 branch.<name>.merge. Prefer submodule.<name>.branch if you want to dis-
	 tribute   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
	 Don't fetch new objects from the remote site. This option is only valid
	 for the update command.

     --checkout
	 Checkout the commit recorded in the superproject on a detached HEAD  in
	 the  submodule.  This option is only valid for the update command. 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
	 Merge the commit recorded in the superproject into the  current  branch
	 of  the submodule. This option is only valid for the update command. 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 re-
	 sulting conflicts within the submodule with the usual conflict  resolu-
	 tion  tools.  If  the key submodule.<name>.update is set to merge, this
	 option is implicit.

     --rebase
	 Rebase the current branch onto the commit recorded in the superproject.
	 This option is only valid for the update command. 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 sub-
	 module.<name>.update is set to rebase, this option is implicit.

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

     --name=<name>
	 Set  the  submodule's name to the given string instead of defaulting to
	 its path.  <name> must be valid as a directory name  and  may	not  end
	 with a /.

     --reference=<repository>
	 Pass  the local <repository> as a reference when cloning the submodule.
	 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,  --shared,  and --dissociate options care-
	     fully.

     --dissociate
	 After using a reference repository to clone from, do  not  rely  on  it
	 anymore.  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
	     See the NOTE above for the --reference option.

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

     --depth=<depth>
	 Create  a  shallow  clone with a history truncated to the <depth> revi-
	 sions. This option is valid for  add  and  update  commands.  See  git-
	 clone(1)

     --recommend-shallow, --no-recommend-shallow
	 Recommend  or	not  shallow  cloning of submodules. 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>
	 Clone new submodules in parallel with <n> jobs.  This	option	is  only
	 valid	for  the update command. Defaults to the submodule.fetchJobs op-
	 tion.

     --single-branch, --no-single-branch
	 Clone only one branch during update: HEAD or one specified by --branch.
	 This option is only valid for the update command.

     <path>...
	 Paths to submodule(s). When specified this will restrict the command to
	 only operate on the submodules found at the specified paths. (This  ar-
	 gument 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 de-
     tails.

SEE ALSO
     gitsubmodules(7), gitmodules(5).

GIT
     Part of the git(1) suite

Git 2.54.0			   2026-04-19			GIT-SUBMODULE(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=git-submodule&sektion=1&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help