Как указать, какой 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.