git-shell(1) — Linux manual page


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 directory.

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

       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 permissions.

       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 2023-06-23.  (At that time,
       the date of the most recent commit that was found in the
       repository was 2023-06-22.)  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         2023-06-22                   GIT-SHELL(1)

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