git-init(1)
===========

NAME
----
git-init - Create an empty Git repository or reinitialize an existing one


SYNOPSIS
--------
[verse]
`git init` [`-q` | `--quiet`] [`--bare`] [++--template=++__<template-directory>__]
	  [`--separate-git-dir` _<git-dir>_] [++--object-format=++__<format>__]
	  [++--ref-format=++__<format>__]
	  [`-b` _<branch-name>_ | ++--initial-branch=++__<branch-name>__]
	  [++--shared++[++=++__<permissions>__]] [_<directory>_]


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

This command creates an empty Git repository - basically a `.git`
directory with subdirectories for `objects`, `refs/heads`,
`refs/tags`, and template files.  An initial branch without any
commits will be created (see the `--initial-branch` option below
for its name).

If the `$GIT_DIR` environment variable is set then it specifies a path
to use instead of `./.git` for the base of the repository.

If the object storage directory is specified via the
`$GIT_OBJECT_DIRECTORY` environment variable then the sha1 directories
are created underneath; otherwise, the default `$GIT_DIR/objects`
directory is used.

Running `git init` in an existing repository is safe. It will not
overwrite things that are already there. The primary reason for
rerunning `git init` is to pick up newly added templates (or to move
the repository to another place if `--separate-git-dir` is given).

OPTIONS
-------

`-q`::
`--quiet`::

Only print error and warning messages; all other output will be suppressed.

`--bare`::

Create a bare repository. If `GIT_DIR` environment is not set, it is set to the
current working directory.

++--object-format=++__<format>__::

Specify the given object _<format>_ (hash algorithm) for the repository.  The valid
values are `sha1` and (if enabled) `sha256`.  `sha1` is the default.
+
include::object-format-disclaimer.txt[]

++--ref-format=++__<format>__::

Specify the given ref storage _<format>_ for the repository. The valid values are:
+
include::ref-storage-format.txt[]

++--template=++__<template-directory>__::

Specify the directory from which templates will be used.  (See the "TEMPLATE
DIRECTORY" section below.)

++--separate-git-dir=++__<git-dir>__::

Instead of initializing the repository as a directory to either `$GIT_DIR` or
`./.git/`, create a text file there containing the path to the actual
repository.  This file acts as a filesystem-agnostic Git symbolic link to the
repository.
+
If this is a reinitialization, the repository will be moved to the specified path.

`-b` _<branch-name>_::
++--initial-branch=++__<branch-name>__::

Use _<branch-name>_ for the initial branch in the newly created
repository.  If not specified, fall back to the default name (currently
`master`, but this is subject to change in the future; the name can be
customized via the `init.defaultBranch` configuration variable).

++--shared++[++=++(`false`|`true`|`umask`|`group`|`all`|`world`|`everybody`|_<perm>_)]::

Specify that the Git repository is to be shared amongst several users.  This
allows users belonging to the same group to push into that
repository.  When specified, the config variable `core.sharedRepository` is
set so that files and directories under `$GIT_DIR` are created with the
requested permissions.  When not specified, Git will use permissions reported
by `umask`(2).
+
The option can have the following values, defaulting to `group` if no value
is given:
+
--
`umask`::
`false`::

Use permissions reported by `umask`(2). The default, when `--shared` is not
specified.

`group`::
`true`::

Make the repository group-writable, (and `g+sx`, since the git group may not be
the primary group of all users). This is used to loosen the permissions of an
otherwise safe `umask`(2) value. Note that the umask still applies to the other
permission bits (e.g. if umask is `0022`, using `group` will not remove read
privileges from other (non-group) users). See `0xxx` for how to exactly specify
the repository permissions.

`all`::
`world`::
`everybody`::

Same as `group`, but make the repository readable by all users.

_<perm>_::

_<perm>_ is a 3-digit octal number prefixed with `0` and each file
will have mode _<perm>_. _<perm>_ will override users' `umask`(2)
value (and not only loosen permissions as `group` and `all`
do). `0640` will create a repository which is group-readable, but
not group-writable or accessible to others. `0660` will create a repo
that is readable and writable to the current user and group, but
inaccessible to others (directories and executable files get their
`x` bit from the `r` bit for corresponding classes of users).
--

By default, the configuration flag `receive.denyNonFastForwards` is enabled
in shared repositories, so that you cannot force a non fast-forwarding push
into it.

If you provide a _<directory>_, the command is run inside it. If this directory
does not exist, it will be created.

TEMPLATE DIRECTORY
------------------

Files and directories in the template directory whose name do not start with a
dot will be copied to the `$GIT_DIR` after it is created.

The template directory will be one of the following (in order):

 - the argument given with the `--template` option;

 - the contents of the `$GIT_TEMPLATE_DIR` environment variable;

 - the `init.templateDir` configuration variable; or

 - the default template directory: `/usr/share/git-core/templates`.

The default template directory includes some directory structure, suggested
"exclude patterns" (see linkgit:gitignore[5]), and sample hook files.

The sample hooks are all disabled by default. To enable one of the
sample hooks rename it by removing its `.sample` suffix.

See linkgit:githooks[5] for more general info on hook execution.

EXAMPLES
--------

Start a new Git repository for an existing code base::
+
----------------
$ cd /path/to/my/codebase
$ git init      <1>
$ git add .     <2>
$ git commit    <3>
----------------
+
<1> Create a `/path/to/my/codebase/.git` directory.
<2> Add all existing files to the index.
<3> Record the pristine state as the first commit in the history.

CONFIGURATION
-------------

include::includes/cmd-config-section-all.txt[]

:git-init:

include::config/init.txt[]

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