Собственный репозиторий на сервере

Для организации собственного репозитория на сервере удобно завести отдельного пользователя и дать ему права только на управление репозиториями на основе git-shell. Порядок действий:

Создаем отдельного пользователя:

adduser git

Меняем файл /etc/passwd, заменив шел на /usr/bin/git-shell:

/etc/passwd
git:x:1001:1001:git,,,:/home/git:/usr/bin/git-shell

Добавляем в файл /home/git/.ssh/authorized_keys свои ключи авторизации (чтобы не вводить пароль) - при желании.

Управление репозиториями

Создаем варианты управления репозиториями в каталоге /home/git/git-shell-commands:

Просмотр справки

help
#!/bin/bash
echo
echo Run 'help' for help, or 'exit' to leave.  Available commands:
echo 'all'
echo 'create (add, make)'
echo 'list (ls)'
echo 'log (show)'
echo 'addkey'

Просмотр всего каталога

all
#!/bin/sh
ls --ignore=git-shell-commands --color

Просмотр всех репозиториев

list
#!/bin/sh
ls -la --color | grep "\.git"

Создание нового репозитория

create
#!/bin/sh
 
# If no project name is given
if [ $# -eq 0 ]
then
 
        # Display usage and stop
        echo "Usage: create <project.git>"
        exit 1
 
fi
 
# Set the project name, adding .git if necessary
project=$(echo "$*" | sed 's/\.git$\|$/.git/i')
 
# Create and initialise the project
mkdir "$project" && \
cd "$project" && \
git --bare init
echo
echo Use:
echo git remote add origin ssh://git@pushorigin.ru/home/git/$project

Просмотр истории репозитория

log
#!/bin/sh
 
if [ $# -eq 0 ]
then
 
        # Display usage and stop
        echo "Usage: log <project.git>"
        exit 1
 
fi
 
# Set the project name, adding .git if necessary
PROJECT=$(echo "$*" | sed 's/\.git$\|$/.git/i')
 
cd $PROJECT
git -c color.status=always log

Добавление ключа авторизации

addkey
#!/bin/sh
 
# If the user is not root
if [ "$USERNAME" != "root" ]
then
 
        # Dislpay a notice and stop
        echo "Sorry, only root can use this command."
        exit 1
 
fi
 
# Read in the SSH key
echo "Input the key to be added:"
read key
 
# Place the key in a temporary file (it's hard to get ssh-keygen
# to read from stdin; <<< works for bash, but is non-posix)
keyfile=$(tempfile) &&\
echo "$key" > $keyfile
 
# Generate a fingerprint
fingerprint=$(ssh-keygen -lf $keyfile)
 
# Check for errors
if [ $(echo "$fingerprint" | egrep -c '(R|D)SA') -eq 0 ]
then
 
        # Display the fingerprint error and clean up
        echo "Error: $fingerprint"
        rm $keyfile
        exit 1
 
fi
 
# Add the key to the authorised keys file and clean up
mkdir -p .ssh &&\
echo -n "no-agent-forwarding,no-port-forwarding,no-X11-forwarding " >> .ssh/authorized_keys &&\
cat $keyfile >> .ssh/authorized_keys
rm $keyfile
 
# Display the fingerprint for reference
echo "Success! Added a key with the following fingerprint:"
echo $fingerprint

Алиасы

Для удобства создаем алиасы:

ln -s create add
ln -s create make
ln -s list ls
ln -s log show