gitmodules(5)
=============

NAME
----
gitmodules - Defining submodule properties

SYNOPSIS
--------
$GIT_WORK_TREE/.gitmodules


DESCRIPTION
-----------

The `.gitmodules` file, located in the top-level directory of a Git
working tree, is a text file with a syntax matching the requirements
of linkgit:git-config[1].

The file contains one subsection per submodule, and the subsection value
is the name of the submodule. The name is set to the path where the
submodule has been added unless it was customized with the `--name`
option of 'git submodule add'. Each submodule section also contains the
following required keys:

submodule.<name>.path::
	Defines the path, relative to the top-level directory of the Git
	working tree, where the submodule is expected to be checked out.
	The path name must not end with a `/`. All submodule paths must
	be unique within the `.gitmodules` file.

submodule.<name>.url::
	Defines a URL from which the submodule repository can be cloned.
	This may be either an absolute URL ready to be passed to
	linkgit:git-clone[1] or (if it begins with `./` or `../`) a location
	relative to the superproject's origin repository.

In addition, there are a number of optional keys:

submodule.<name>.update::
	Defines the default update procedure for the named submodule,
	i.e. how the submodule is updated by the `git submodule update`
	command in the superproject. This is only used by `git
	submodule init` to initialize the configuration variable of
	the same name. Allowed values here are 'checkout', 'rebase',
	'merge' or 'none', but not '!command' (for security reasons).
	See the description of the 'update' command in
	linkgit:git-submodule[1] for more details.

submodule.<name>.branch::
	A remote branch name for tracking updates in the upstream submodule.
	If the option is not specified, it defaults to the remote `HEAD`.
	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.  See the `--remote` documentation in
	linkgit:git-submodule[1] for details.

submodule.<name>.fetchRecurseSubmodules::
	This option can be used to control recursive fetching of this
	submodule. If this option is also present in the submodule's entry in
	`.git/config` of the superproject, the setting there will override the
	one found in `.gitmodules`.
	Both settings can be overridden on the command line by using the
	`--[no-]recurse-submodules` option to `git fetch` and `git pull`.

submodule.<name>.ignore::
	Defines under what circumstances `git status` and the diff family show
	a submodule as modified. The following values are supported:
+
--
	all;; The submodule will never be considered modified (but will
	    nonetheless show up in the output of status and commit when it has
	    been staged).

	dirty;; All changes to the submodule's work tree will be ignored, only
	    committed differences between the `HEAD` of the submodule and its
	    recorded state in the superproject are taken into account.

	untracked;; Only untracked files in submodules will be ignored.
	    Committed differences and modifications to tracked files will show
	    up.

	none;; No modifications to submodules are ignored, all of committed
	    differences, and modifications to tracked and untracked files are
	    shown. This is the default option.

If this option is also present in the submodule's entry in `.git/config`
of the superproject, the setting there will override the one found in
`.gitmodules`.

Both settings can be overridden on the command line by using the
`--ignore-submodules` option. The `git submodule` commands are not
affected by this setting.
--

submodule.<name>.shallow::
	When set to true, a clone of this submodule will be performed as a
	shallow clone (with a history depth of 1) unless the user explicitly
	asks for a non-shallow clone.

NOTES
-----

Git does not allow the `.gitmodules` file within a working tree to be a
symbolic link, and will refuse to check out such a tree entry. This
keeps behavior consistent when the file is accessed from the index or a
tree versus from the filesystem, and helps Git reliably enforce security
checks of the file contents.

EXAMPLES
--------

Consider the following `.gitmodules` file:

----
[submodule "libfoo"]
	path = include/foo
	url = git://foo.com/git/lib.git

[submodule "libbar"]
	path = include/bar
	url = git://bar.com/git/lib.git
----

This defines two submodules, `libfoo` and `libbar`. These are expected to
be checked out in the paths `include/foo` and `include/bar`, and for both
submodules a URL is specified which can be used for cloning the submodules.

SEE ALSO
--------
linkgit:git-submodule[1], linkgit:gitsubmodules[7], linkgit:git-config[1]

GIT
---
Part of the linkgit:git[1] suite
