# git-daemon

## NAME



           git-daemon - A really simple server for Git repositories
    


## SYNOPSIS



           **git daemon**[**--verbose**] [**--syslog**] [**--export-all**]
                      [**--timeout=**_< n>_] [**--init-timeout=**_< n>_] [**--max-connections=**_< n>_]
                      [**--strict-paths**] [**--base-path=**_< path>_] [**--base-path-relaxed**]
                      [**--user-path** | **--user-path=**_< path>_]
                      [**--interpolated-path=**_< pathtemplate>_]
                      [**--reuseaddr**] [**--detach**] [**--pid-file=**_< file>_]
                      [**--enable=**_< service>_] [**--disable=**_< service>_]
                      [**--allow-override=**_< service>_] [**--forbid-override=**_< service>_]
                      [**--access-hook=**_< path>_] [**--**[**no-**]**informative-errors**]
                      [**--inetd** |
                        [**--listen=**_< host-or-ipaddr>_] [**--port=**_< n>_]
                        [**--user=**_< user>_ [**--group=**_< group>_]]]
                      [**--log-destination=**(**stderr** |**syslog** |**none**)]
                      [_< directory>_...]
    


## DESCRIPTION



           A really simple TCP Git daemon that normally listens on port
           "DEFAULT_GIT_PORT" aka 9418. It waits for a connection asking for
           a service, and will serve that service if it is enabled.
    
           It verifies that the directory has the magic file
           "git-daemon-export-ok", and it will refuse to export any Git
           directory that hasn’t explicitly been marked for export this way
           (unless the **--export-all** parameter is specified). If you pass some
           directory paths as **git daemon** arguments, the offers are limited to
           repositories within those directories.
    
           By default, only **upload-pack** service is enabled, which serves **git**
           **fetch-pack** and **git ls-remote** clients, which are invoked from **git**
           **fetch** , **git pull** , and **git clone**.
    
           This is ideally suited for read-only updates, i.e., pulling from
           Git repositories.
    
           An **upload-archive** also exists to serve **git archive**.
    


## OPTIONS



           **--strict-paths**
               Match paths exactly (i.e. don’t allow "/foo/repo" when the
               real path is "/foo/repo.git" or "/foo/repo/.git") and don’t do
               user-relative paths.  **git daemon** will refuse to start when
               this option is enabled and no directory arguments are
               provided.
    
           **--base-path=**_< path>_
               Remap all the path requests as relative to the given path.
               This is sort of "Git root" - if you run **git daemon** with
               **--base-path=/srv/git** on **example.com** , then if you later try to
               pull from **git://example.com/hello.git** , **git daemon** will
               interpret the path as **/srv/git/hello.git**.
    
           **--base-path-relaxed**
               If **--base-path** is enabled and repo lookup fails, with this
               option **git daemon** will attempt to lookup without prefixing the
               base path. This is useful for switching to **--base-path** usage,
               while still allowing the old paths.
    
           **--interpolated-path=**_< pathtemplate>_
               To support virtual hosting, an interpolated path template can
               be used to dynamically construct alternate paths. The template
               supports **%H** for the target hostname as supplied by the client
               but converted to all lowercase, **%CH** for the canonical
               hostname, **%IP** for the server’s IP address, **%P** for the port
               number, and **%D** for the absolute path of the named repository.
               After interpolation, the path is validated against the
               directory list.
    
           **--export-all**
               Allow pulling from all directories that look like Git
               repositories (have the _objects_ and _refs_ subdirectories), even
               if they do not have the **git-daemon-export-ok** file.
    
           **--inetd**
               Have the server run as an inetd service. Implies **--syslog**(may
               be overridden with **--log-destination=**). Incompatible with
               **--detach** , **--port** , **--listen** , **--user** and **--group** options.
    
           **--listen=**_< host-or-ipaddr>_
               Listen on a specific IP address or hostname. IP addresses can
               be either an IPv4 address or an IPv6 address if supported. If
               IPv6 is not supported, then **--listen=**_< hostname>_ is also not
               supported and **--listen** must be given an IPv4 address. Can be
               given more than once. Incompatible with **--inetd** option.
    
           **--port=**_< n>_
               Listen on an alternative port. Incompatible with **--inetd**
               option.
    
           **--init-timeout=**_< n>_
               Timeout (in seconds) between the moment the connection is
               established and the client request is received (typically a
               rather low value, since that should be basically immediate).
    
           **--timeout=**_< n>_
               Timeout (in seconds) for specific client sub-requests. This
               includes the time it takes for the server to process the
               sub-request and the time spent waiting for the next client’s
               request.
    
           **--max-connections=**_< n>_
               Maximum number of concurrent clients, defaults to 32. Set it
               to zero for no limit.
    
           **--syslog**
               Short for **--log-destination=syslog**.
    
           **--log-destination=**_< destination>_
               Send log messages to the specified destination. Note that this
               option does not imply **--verbose** , thus by default only error
               conditions will be logged. The _< destination>_ must be one of:
    
               **stderr**
                   Write to standard error. Note that if **--detach** is
                   specified, the process disconnects from the real standard
                   error, making this destination effectively equivalent to
                   **none**.
    
               **syslog**
                   Write to syslog, using the **git-daemon** identifier.
    
               **none**
                   Disable all logging.
    
               The default destination is **syslog** if **--inetd** or **--detach** is
               specified, otherwise **stderr**.
    
           **--user-path** , **--user-path=**_< path>_
               Allow ~user notation to be used in requests. When specified
               with no parameter, a request to git://host/~alice/foo is taken
               as a request to access _foo_ repository in the home directory of
               user **alice**. If **--user-path=**_< path>_ is specified, the same
               request is taken as a request to access _< path>_**/foo** repository
               in the home directory of user **alice**.
    
           **--verbose**
               Log details about the incoming connections and requested
               files.
    
           **--reuseaddr**
               Use **SO_REUSEADDR** when binding the listening socket. This
               allows the server to restart without waiting for old
               connections to time out.
    
           **--detach**
               Detach from the shell. Implies **--syslog**.
    
           **--pid-file=**_< file>_
               Save the process id in _< file>_. Ignored when the daemon is run
               under **--inetd**.
    
           **--user=**_< user>_, **--group=**_< group>_
               Change daemon’s uid and gid before entering the service loop.
               When only **--user** is given without **--group** , the primary group
               ID for the user is used. The values of the option are given to
               **getpwnam**(**3**) and **getgrnam**(**3**) and numeric IDs are not supported.
    
               Giving these options is an error when used with **--inetd** ; use
               the facility of inet daemon to achieve the same before
               spawning **git daemon** if needed.
    
               Like many programs that switch user id, the daemon does not
               reset environment variables such as **HOME** when it runs git
               programs, e.g.  **upload-pack** and **receive-pack**. When using this
               option, you may also want to set and export **HOME** to point at
               the home directory of _< user>_ before starting the daemon, and
               make sure any Git configuration files in that directory are
               readable by _< user>_.
    
           **--enable=**_< service>_, **--disable=**_< service>_
               Enable/disable the service site-wide per default. Note that a
               service disabled site-wide can still be enabled per repository
               if it is marked overridable and the repository enables the
               service with a configuration item.
    
           **--allow-override=**_< service>_, **--forbid-override=**_< service>_
               Allow/forbid overriding the site-wide default with per
               repository configuration. By default, all the services may be
               overridden.
    
           **--informative-errors** , **--no-informative-errors**
               When informative errors are turned on, git-daemon will report
               more verbose errors to the client, differentiating conditions
               like "no such repository" from "repository not exported". This
               is more convenient for clients, but may leak information about
               the existence of unexported repositories. When informative
               errors are not enabled, all errors report "access denied" to
               the client. The default is **--no-informative-errors**.
    
           **--access-hook=**_< path>_
               Every time a client connects, first run an external command
               specified by the <path> with service name (e.g.
               "upload-pack"), path to the repository, hostname (**%H**),
               canonical hostname (**%CH**), IP address (**%IP**), and TCP port (**%P**)
               as its command-line arguments. The external command can decide
               to decline the service by exiting with a non-zero status (or
               to allow it by exiting with a zero status). It can also look
               at the $REMOTE_ADDR and **$REMOTE_PORT** environment variables to
               learn about the requestor when making this decision.
    
               The external command can optionally write a single line to its
               standard output to be sent to the requestor as an error
               message when it declines the service.
    
           _< directory>_
               The remaining arguments provide a list of directories. If any
               directories are specified, then the **git-daemon** process will
               serve a requested directory only if it is contained in one of
               these directories. If **--strict-paths** is specified, then the
               requested directory must match one of these directories
               exactly.
    


## SERVICES



           These services can be globally enabled/disabled using the
           command-line options of this command. If finer-grained control is
           desired (e.g. to allow **git archive** to be run against only in a few
           selected repositories the daemon serves), the per-repository
           configuration file can be used to enable or disable them.
    
           upload-pack
               This serves **git fetch-pack** and **git ls-remote** clients. It is
               enabled by default, but a repository can disable it by setting
               **daemon.uploadpack** configuration item to **false**.
    
           upload-archive
               This serves **git archive --remote**. It is disabled by default,
               but a repository can enable it by setting **daemon.uploadarch**
               configuration item to **true**.
    
           receive-pack
               This serves **git send-pack** clients, allowing anonymous push. It
               is disabled by default, as there is _no_ authentication in the
               protocol (in other words, anybody can push anything into the
               repository, including removal of refs). This is solely meant
               for a closed LAN setting where everybody is friendly. This
               service can be enabled by setting **daemon.receivepack**
               configuration item to **true**.
    


## EXAMPLES



           We assume the following in /etc/services
    
                   $ grep 9418 /etc/services
                   git             9418/tcp                # Git Version Control System
    
           _git daemon_ as inetd server
               To set up _git daemon_ as an inetd service that handles any
               repository within **/pub/foo** or **/pub/bar** , place an entry like
               the following into **/etc/inetd** all on one line:
    
                           git stream tcp nowait nobody  /usr/bin/git
                                   git daemon --inetd --verbose --export-all
                                   /pub/foo /pub/bar
    
           _git daemon_ as inetd server for virtual hosts
               To set up _git daemon_ as an inetd service that handles
               repositories for different virtual hosts, **www.example.com** and
               **www.example.org** , place an entry like the following into
               **/etc/inetd** all on one line:
    
                           git stream tcp nowait nobody /usr/bin/git
                                   git daemon --inetd --verbose --export-all
                                   --interpolated-path=/pub/%H%D
                                   /pub/www.example.org/software
                                   /pub/www.example.com/software
                                   /software
    
               In this example, the root-level directory **/pub** will contain a
               subdirectory for each virtual host name supported. Further,
               both hosts advertise repositories simply as
               **git://www.example.com/software/repo.git**. For pre-1.4.0
               clients, a symlink from **/software** into the appropriate default
               repository could be made as well.
    
           _git daemon_ as regular daemon for virtual hosts
               To set up **git daemon** as a regular, non-inetd service that
               handles repositories for multiple virtual hosts based on their
               IP addresses, start the daemon like this:
    
                           git daemon --verbose --export-all
                                   --interpolated-path=/pub/%IP/%D
                                   /pub/192.168.1.200/software
                                   /pub/10.10.220.23/software
    
               In this example, the root-level directory **/pub** will contain a
               subdirectory for each virtual host IP address supported.
               Repositories can still be accessed by hostname though,
               assuming they correspond to these IP addresses.
    
           selectively enable/disable services per repository
               To enable **git archive --remote** and disable **git fetch** against a
               repository, have the following in the configuration file in
               the repository (that is the file _config_ next to **HEAD** , _refs_ and
               _objects_).
    
                           [daemon]
                                   uploadpack = false
                                   uploadarch = true
    


## ENVIRONMENT



           **git daemon** will set **REMOTE_ADDR** to the IP address of the client
           that connected to it, if the IP address is available. **REMOTE_ADDR**
           will be available in the environment of hooks called when services
           are performed.
    


## GIT



           Part of the git(1) suite
    


* * *