Как указать, какой SSH-ключ использовать в git для git push, чтобы иметь gitorious как зеркало?
У меня есть проект, размещенный на git.debian.org(alioth), и я бы хотел настроить hook-post-receive для обновления зеркала репозитория на http://gitorious.org
Я полагаю, мне придется использовать git push --mirror gitorious
Теперь, мне нужно, чтобы Алиот санкционировал на gitorious для того, чтобы добиться успеха. Как это сделать?
Я полагаю, мне нужно настроить пользователя на gitorious и создать для него ключ ssh. И затем, когда я нажимаю git на крючок после приема, убедитесь, что этот ключ ssh используется.
Я мог бы использовать ~/.ssh/config
, но проблема в том, что многие пользователи могут нажимать alioth, и каждый должен будет войти в систему и настроить ~/.ssh/config
. Вместо этого я хотел бы иметь параметр командной строки или переменную среды, чтобы сообщить ssh, какой ключ использовать. Могу ли я это сделать?
Кроме того, есть ли у вас другие идеи о том, как можно добиться зеркалирования? И, можно ли настроить его наоборот? (Gitorious pushing on alioth)?
Ответы
Ответ 1
Ответ можно найти в справочном руководстве git.
GIT_SSH
Если эта переменная среды установлена, то git fetch и git push будет использовать эту команду вместо ssh, когда им необходимо подключиться к удаленной системе. Команде $GIT_SSH
будет задано ровно два аргумента: имя пользователя @хост (или только хост) из URL-адреса и команда оболочки для выполнения в этой удаленной системе.
Чтобы передать параметры программе, которую вы хотите перечислить в GIT_SSH
, вам нужно будет обернуть программу и параметры в оболочку script, а затем установить GIT_SSH
для ссылки на оболочку script.
Как правило, проще настроить любые нужные параметры через ваш личный файл .ssh/config
. Для получения дополнительной информации обратитесь к документации по ssh.
Итак, мне нужно написать оболочку script, я пишу это push-gitorious.sh
script:
#!/bin/sh
if [ "run" != "$1" ]; then
exec ssh -i "$GITORIOUS_IDENTITY_FILE" -o "StrictHostKeyChecking no" "[email protected]"
fi
remote=YOUR_SSH_GITORIOUS_URL
echo "Mirroring to $remote"
export GITORIOUS_IDENTITY_FILE="`mktemp /tmp/tmp.XXXXXXXXXX`"
export GIT_SSH="$0"
cat >"$GITORIOUS_IDENTITY_FILE" <<EOF
YOUR SSH PRIVATE KEY
EOF
cat >"$GITORIOUS_IDENTITY_FILE.pub" <<EOF
YOUR SSH PUBLIC KEY
EOF
#echo git push --mirror "$remote"
git push --mirror "$remote"
rm -f "$GITORIOUS_IDENTITY_FILE"
rm -f "$GITORIOUS_IDENTITY_FILE.pub"
exit 0
Конечно, вы должны заполнить закрытый ключ (открытый ключ включен только в ссылку script). Вам также нужно заполнить gitorious URL.
В приеме после приема вам нужно поставить:
path/to/push-gitorious.sh run
Параметр запуска имеет важное значение, иначе он будет запускать ssh напрямую.
Предупреждение: проверка подлинности удаленного хоста не выполняется. Вы можете удалить эту опцию из командной строки ssh и настроить known_hosts
, если хотите. В этом случае я не думаю, что это важно.
Ответ 2
Это два метода, которые я знаю, чтобы указать любой ключевой файл, который вы хотите использовать для сайта git в командной строке git. Вам не нужно жестко закодировать этот ключевой файл в файле конфигурации или script. Вы просто передаете это прямо в командной строке git.
Метод 1: Используйте переменную среды GIT_SSH
В командной строке будет использоваться следующее:
$ PKEY=~/.ssh/keyfile.pem git clone [email protected]:me/repo.git
Чтобы использовать эту команду, вам нужно выполнить предварительную настройку. Сначала создайте оболочку script со следующим содержимым:
#!/bin/sh
if [ -z "$PKEY" ]; then
# if PKEY is not specified, run ssh using default keyfile
ssh "[email protected]"
else
ssh -i "$PKEY" "[email protected]"
fi
Затем экспортируйте и установите переменную GIT_SSH со значением, равным расположению оболочки script выше.
$ export GIT_SSH=~/ssh-git.sh
где ~/ssh- git.sh - это имя файла оболочки script выше.
script должен быть исполняемым, поэтому выполните команду chmod:
$ chmod +x ~/ssh-git.sh
Теперь вы можете запустить эту команду с любым ключевым файлом, который вы решили использовать:
$ PKEY=~/.ssh/keyfile1.pem git clone [email protected]:me/repo.git
Чтобы использовать другой ключевой файл для другого хоста:
$ PKEY=~/.ssh/keyfile2.pem git clone [email protected]:other/repo.git
Это поддерживает любой ключевой файл, который вы хотите использовать. Каждый раз, когда вам нужно запустить git с помощью ключевого файла, который вы хотите использовать, просто поставьте его в переменную PKEY. Вы можете забыть обо всем остальном, пока GIT_SSH был предварительно настроен.
Обратите внимание на переменную PKEY. Вы можете использовать любое имя, если оно соответствует тому, что используется в оболочке script GIT_SSH, указывающей на.
Способ 2. Используйте обертку script
Использование оболочки script будет примерно таким:
$ git.sh -i ~/.ssh/keyfile.pem clone [email protected]:me/repo.git
Это использование интуитивно понятно, так как оно выглядит как запуск ssh с опцией -i.
Это не требует предварительной настройки оболочки script и GIT_SSH. Вам нужно только загрузить и запустить эту единственную оболочку script с помощью команды git.
Вы можете получить копию этой обертки script здесь:
http://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command/
Ответ 3
Более простая альтернатива, которая не включает никаких внешних скриптов, заключается в использовании псевдонима SSH. Я знаю, что оригинальный плакат попросил специально не изменять ~/.ssh/config, но я подозреваю, что здесь есть недоразумение.
Локальный пользователь на сервере не такой, как человек, выполняющий фиксацию, и может быть другим человеком, чем тот, кто делает "git push".
- на сервере хостинг-программное обеспечение может работать как один пользователь (обычно git)
- личность человека, совершающего коммит, - это git buisness (для добавления метаданных для передачи), не имеет отношения к серверу и не подвержена аутентификации на сервере.
- идентификатор 'git push'-er имеет значение и устанавливается на
системы, на которых выполняется хостинг программного обеспечения git на сервере, на основе ключа ssh
По этой причине в системе, выполняющей push, можно принудительно установить конкретную идентификацию даже для одной и той же локальной учетной записи и того же удаленного сервера, даже в том же репозитории git, используя псевдоним ssh, используя метод, описанный ниже.
Предположим, что у вас на сервере gitorious.org ваша обычная учетная запись, позвольте назвать ее "разработчиком".
Вы не хотите автоматически нажимать свою учетную запись "разработчик" [1], поэтому вы создаете еще одну замечательную учетную запись для синхронизации, назовите ее "роботом".
Для автоматизации будет использоваться только учетная запись "robot":
Шаг 1. Добавьте "робот" в проект gitorius, который нужно нажать.
Шаг 2. На локальной машине создайте ключ без пароля (это будет связано с учетной записью робота на gitorious).
ssh-keygen -f ~/.ssh/id_rsa_robot
Шаг 3: загрузите открытый ключ ~/.ssh/id_rsa_robot.pub на gitorious в учетной записи "robot".
Шаг 4. git SSH URI на gitorious имеют формат git @ gitorious.org: prj_or_user/subproject.git. В файле ~/.ssh/config добавьте следующие строки:
host robot.gitorious.org
HostName gitorious.org
IdentityFile ~/.ssh/id_rsa_robot
IdentitiesOnly "yes"
Это гарантирует, что:
- всякий раз, когда вы используете имя хоста 'robot.gitorious.org', оно будет подключаться
на gitorious.org(параметр HostName),
- он будет использовать ключ без пароля для аутентификации в качестве робота
gitorius.org(опция IdentiFile) и
- даже если у вас запущен агент ssh, он будет игнорировать ключ по умолчанию
и используйте без пароля (IdentiesOnly "yes" ).
Шаг 5. Предполагая, что URI SSH на gitorious для вашего проекта будет git @gitorious.org: project/project.git ', в локальном репозитории определите новый удаленный' autopush ' со слегка измененным именем хоста:
git remote add autopush [email protected]:project/project.git
Настройка завершена, теперь попробуйте нажать на кнопку "autopush" удаленно.
git push autopush master
Если все пойдет хорошо, и есть изменения в толчке, вы должны увидеть, что вы успешно нажали на "gitorious.org" как "робот"
[1] Для автоматических нажатий для учетной записи должен быть создан ключ без пароля, но привязка его к заветной учетной записи "разработчика" означает, что автоматизированная работа может подтолкнуть к любому из проектов, в которых "разработчик" задействован Gitorious.