GIT-SHELL(1)                     Git Manual                     GIT-SHELL(1)

NAME         top

       git-shell - Restricted login shell for Git-only SSH access

SYNOPSIS         top

       chsh -s $(command -v git-shell) <user>
       git clone <user>@localhost:/path/to/repo.git
       ssh <user>@localhost

DESCRIPTION         top

       This is a login shell for SSH accounts to provide restricted Git
       access. It permits execution only of server-side Git commands
       implementing the pull/push functionality, plus custom commands
       present in a subdirectory named git-shell-commands in the user’s home

COMMANDS         top

       git shell accepts the following commands after the -c option:

       git receive-pack <argument>, git upload-pack <argument>, git
       upload-archive <argument>
           Call the corresponding server-side command to support the
           client’s git push, git fetch, or git archive --remote request.

       cvs server
           Imitate a CVS server. See git-cvsserver(1).

       If a ~/git-shell-commands directory is present, git shell will also
       handle other, custom commands by running
       "git-shell-commands/<command> <arguments>" from the user’s home


       By default, the commands above can be executed only with the -c
       option; the shell is not interactive.

       If a ~/git-shell-commands directory is present, git shell can also be
       run interactively (with no arguments). If a help command is present
       in the git-shell-commands directory, it is run to provide the user
       with an overview of allowed actions. Then a "git> " prompt is
       presented at which one can enter any of the commands from the
       git-shell-commands directory, or exit to close the connection.

       Generally this mode is used as an administrative interface to allow
       users to list repositories they have access to, create, delete, or
       rename repositories, or change repository descriptions and

       If a no-interactive-login command exists, then it is run and the
       interactive shell is aborted.

EXAMPLES         top

       To disable interactive logins, displaying a greeting instead:

           $ chsh -s /usr/bin/git-shell
           $ mkdir $HOME/git-shell-commands
           $ cat >$HOME/git-shell-commands/no-interactive-login <<\EOF
           printf '%s\n' "Hi $USER! You've successfully authenticated, but I do not"
           printf '%s\n' "provide interactive shell access."
           exit 128
           $ chmod +x $HOME/git-shell-commands/no-interactive-login

       To enable git-cvsserver access (which should generally have the
       no-interactive-login example above as a prerequisite, as creating the
       git-shell-commands directory allows interactive logins):

           $ cat >$HOME/git-shell-commands/cvs <<\EOF
           if ! test $# = 1 && test "$1" = "server"
                   echo >&2 "git-cvsserver only handles \"server\""
                   exit 1
           exec git cvsserver server
           $ chmod +x $HOME/git-shell-commands/cvs

SEE ALSO         top

       ssh(1), git-daemon(1), contrib/git-shell-commands/README

GIT         top

       Part of the git(1) suite

COLOPHON         top

       This page is part of the git (Git distributed version control system)
       project.  Information about the project can be found at 
       ⟨⟩.  If you have a bug report for this manual page,
       see ⟨⟩.  This page was obtained from the
       project's upstream Git repository ⟨⟩ on
       2018-10-29.  (At that time, the date of the most recent commit that
       was found in the repository was 2018-10-26.)  If you discover any
       rendering problems in this HTML version of the page, or you believe
       there is a better or more up-to-date source for the page, or you have
       corrections or improvements to the information in this COLOPHON
       (which is not part of the original manual page), send a mail to

Git           10/28/2018                     GIT-SHELL(1)

Pages that refer to this page: git(1)githooks(5)gitcvs-migration(7)giteveryday(7)