Содержание
Собственный репозиторий на сервере
Для организации собственного репозитория на сервере удобно завести отдельного пользователя и дать ему права только на управление репозиториями на основе 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