2015-02-09 2 views
1

У меня есть собственный собственный git-сервер, и у меня есть команда из 5 человек. У меня есть все учетные записи пользователей, но как я могу предотвратить фиксацию удаленной записи случайными странными учетными записями. Потому что некоторые из моей команды также используют github и не хотят, чтобы их имена пользователей появлялись в журнале, а скорее их имя пользователя, которое я им назначил.Предотвращение других авторов git

+0

Релевантно: http: // stackoverflow.com/q/117006/251311 – zerkms

+0

Не то же самое ... Я в основном хочу какой-то метод проверки подлинности. Поэтому моя команда не может совершать как другие команды, просто перейдя git --config.name = "Test" –

+0

@MaraisRossouw В этом случае вам придется использовать gerrit или gitlab или какой-либо другой инструмент. –

ответ

3

Чтобы предотвратить людей, совершающих использование «случайных странных учетных записей», вы можете настроить крючок git pre-receive для проверки имен коммитеров/авторов при входящих коммитах на список допустимых имен. Но это не обеспечивает компонент аутентификации.

Чтобы избежать олицетворения, вы могли просто потребовать, чтобы все сообщения были подписаны с помощью gpg (git commit -S ...), и у вас есть pre-receive hook, проверяющий подписи против gpg-ключа на сервере.

В зависимости от того, как люди подключаются к удаленному серверу, вы также можете явно сопоставить имя комминера/автора с именем пользователя, используемым для соединения, если у вас есть к нему доступ.

Update 1

Если коммиттеры подталкивают к серверу через SSH, то третий вариант выше, вероятно, самый простой. В файле .ssh/authorized_keys, установить переменные окружения для каждого ключа, который идентифицирует пользователь:

environment="SSH_USER=lars" ssh-rsa ... 

И тогда в вашем pre-receive крючке, вы можете использовать это переменные окружения для поиска действительных имен/писем коммиттера против некоторой таблицы. Вы можете прочитать о pre-receive крюки на странице githooks(5) человека, они получают на стандартный ввод строки вида:

<oldrev> <newrev> <refname> 

Вы можете получить имя фиксации из <newrev> так:

commiter_name=$(git show -s --format='format:%cn' <newrev>) 

и почта используя %ce вместо %cn.

Update 2

Или черт, просто забыть табличный поиск. В вашем .ssh/authorized_keys файле:

environment="ALLOWED_NAME=Bob Jones",environment="[email protected]" ssh-rsa ... 

И тогда в вашей предварительно получить крюк:

#!/bin/sh 

while read oldrev newrev refname; do 
    cn=$(git show -s --format='format:%cn' $newrev) 
    ce=$(git show -s --format='format:%ce' $newrev) 

    [ "$cn" = "$ALLOWED_NAME" ] || { 
    echo "*** Inalid committer name" 
    exit 1 
    } 

    [ "$ce" = "$ALLOWED_EMAIL" ] || { 
    echo "*** Inalid committer email" 
    exit 1 
    } 

done 

И я думаю, что у вас есть то, что вы хотите.

Update 3

Вы могли бы сделать что-то подобное с использованием аутентификации HTTP , потому что в вашем pre-receive сценария вы бы иметь доступ к переменным REMOTE_USER среды, которая содержит имени аутентифицированного удаленного пользователя. Вам, вероятно, понадобится пойти с каким-то видом таблицы, чтобы получить значение утвержденных имен и адресов электронной почты.

+0

Хорошо. Да, у меня есть настройка учетной записи linux для каждого коммиттера, как я могу проверить подписи gpg с их именем? И как выглядела бы пре-передача? И поскольку у меня есть довольно много репозиториев, мне бы пришлось сделать это для каждого репо? –

+1

Я немного обновил ответ. Если вы решите пойти по пути 'gpg', это, вероятно, будет включать в себя' grep'ing вывод чего-то вроде 'git show -s -format = format: '' --show-signature ' для 'Good signature'. – larsks

+0

Я обновил его снова. Думаю, мне нравится это решение лучше. По крайней мере, проще реализовать. – larsks

Смежные вопросы