Как указать, какой SSH-ключ использовать в git для git push, чтобы он был зеркалом? - PullRequest
39 голосов
/ 16 августа 2010

У меня есть проект, размещенный на git.debian.org (alioth), и я хотел бы настроить хук после получения для обновления зеркала репозитория на http://gitorious.org

Полагаю, яМне нужно будет использовать git push --mirror gitorious

Теперь мне нужно авторизовать Алиота на gitorious, чтобы толчок был успешным.Как мне это сделать?

Полагаю, мне нужно настроить пользователя на gitorious и создать для него ключ ssh.И затем, когда я делаю git push в хуке post-receive, убедитесь, что используется этот ключ ssh.

Я мог бы использовать ~/.ssh/config, но проблема в том, что многие пользователи могут нажать alioth, и каждыйпридется войти и настроить ~/.ssh/config.Вместо этого я хотел бы иметь параметр командной строки или переменную среды, чтобы сообщить ssh, какой ключ использовать.Могу ли я это сделать?

Кроме того, у вас есть другие идеи, как можно добиться зеркального отражения?И возможно ли настроить его наоборот (громкое нажатие на алиоте)?

Ответы [ 3 ]

37 голосов
/ 17 августа 2010

Ответ можно найти в справочном руководстве git .

GIT_SSH

Если эта переменная окружения установлена, то git fetch и git push будут использовать эту команду вместо ssh, когда им необходимо подключиться к удаленной системе. Команде $GIT_SSH будет дано ровно два аргумента: имя пользователя @ host (или просто host) из URL-адреса и команда оболочки для выполнения в этой удаленной системе.

Чтобы передать параметры программе, которую вы хотите перечислить в GIT_SSH, вам нужно заключить программу и параметры в сценарий оболочки, а затем установить GIT_SSH для ссылки на сценарий оболочки.

Обычно проще настроить любые нужные параметры с помощью личного файла .ssh/config. Пожалуйста, обратитесь к документации ssh для получения более подробной информации.

Итак, мне нужно написать скрипт-обертку, я пишу этот push-gitorious.sh скрипт:

#!/bin/sh


if [ "run" != "$1" ]; then
  exec ssh -i "$GITORIOUS_IDENTITY_FILE" -o "StrictHostKeyChecking no" "$@"
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

Конечно, вы должны заполнить закрытый ключ (открытый ключ включен в скрипт только для справки. Вам также необходимо заполнить восхитительный URL.

В крюк после получения вы должны положить:

path/to/push-gitorious.sh run

Параметр run важен, иначе он будет запускать ssh напрямую.

Предупреждение: проверка подлинности удаленного хоста не производится. Вы можете удалить эту опцию из командной строки ssh и настроить known_hosts, если хотите. В этом случае я не думаю, что это важно.

28 голосов
/ 24 марта 2013

Я знаю два метода, так что вы можете указать любой ключевой файл, который вы хотите использовать для сайта git, в командной строке git. Вам не нужно жестко кодировать этот ключевой файл в конфигурационном файле или скрипте. Вы просто указываете это прямо в командной строке git.

Метод 1. Использование переменной среды GIT_SSH

Использование будет таким в командной строке:

$ PKEY=~/.ssh/keyfile.pem git clone git@github.com:me/repo.git

Чтобы использовать эту команду, вам необходимо выполнить некоторые предварительные настройки. Сначала создайте сценарий оболочки со следующим содержимым:

#!/bin/sh
if [ -z "$PKEY" ]; then
    # if PKEY is not specified, run ssh using default keyfile
    ssh "$@"
else
    ssh -i "$PKEY" "$@"
fi

Затем экспортируйте и установите переменную GIT_SSH со значением, равным расположению сценария оболочки выше.

$ export GIT_SSH=~/ssh-git.sh

где ~ / ssh-git.sh - имя файла сценария оболочки выше.

Сценарий должен быть исполняемым, поэтому выполните команду chmod:

$ chmod +x ~/ssh-git.sh

Теперь вы можете запустить эту команду с любым файлом ключей, который вы решите использовать:

$ PKEY=~/.ssh/keyfile1.pem git clone git@github.com:me/repo.git

Чтобы использовать другой ключевой файл для другого хоста:

$ PKEY=~/.ssh/keyfile2.pem git clone git@myothersite.com:other/repo.git

Это поддерживает любой ключевой файл, который вы хотите использовать. Каждый раз, когда вам нужно запустить git с файлом ключа, который вы хотите использовать, просто укажите его в переменной PKEY. Вы можете забыть все остальное, если GIT_SSH был предварительно настроен.

Обратите внимание на переменную PKEY. Вы можете использовать любое имя, если оно совпадает с тем, которое используется в сценарии оболочки, на который указывает GIT_SSH.

Способ 2. Использование сценария-оболочки

Использование скрипта-обёртки будет примерно таким:

$ git.sh -i ~/.ssh/keyfile.pem clone git@github.com:me/repo.git

Это использование интуитивно понятно, так как похоже на запуск ssh с опцией -i.

Это не требует предварительной настройки скрипта оболочки и GIT_SSH. Вам нужно только загрузить и запустить этот скрипт-скрипт с помощью команды git.

Вы можете получить копию этого сценария оболочки здесь: http://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command/

3 голосов
/ 05 октября 2014

Более простой альтернативой, которая не включает какие-либо внешние сценарии, является использование псевдонима SSH. Я знаю, что оригинальный постер просил не изменять ~ / .ssh / config, но я подозреваю, что здесь есть недоразумение.

Локальный пользователь на сервере не тот, кто выполняет коммит, и может отличаться от пользователя, выполняющего «git push».

  • на сервере программное обеспечение хостинга может запускаться как один пользователь (обычно «git»)
  • личность человека, выполняющего фиксацию, является только бизнесом git (для добавления к метаданным фиксации), не имеет отношения к серверу и не подлежит аутентификации на сервере
  • личность 'git push' -er актуальна и установлена ​​на системы, на которых запущено программное обеспечение хостинга git на сервере по ключу ssh

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

Предположим, у вас на сервере gitorious.org есть ваша обычная учетная запись, назовем ее «разработчик». Вы не хотите автоматически использовать учетную запись разработчика [1] , поэтому вы создаете еще одну великолепную учетную запись для синхронизации, назовем ее «роботом».

Для автоматизации будет использоваться только учетная запись «робота»:

Шаг 1 : Добавить «робота» в проект gitorius, к которому нужно подтолкнуть.

Шаг 2 : На локальном компьютере создайте ключ без пароля (это будет связано с учетной записью робота на gitorious).

ssh-keygen -f ~/.ssh/id_rsa_robot

Шаг 3 : загрузить открытый ключ ~ / .ssh / id_rsa_robot.pub на gitorious в учетной записи «робота».

Шаг 4 : URI git SSH на 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 «да»).

Шаг 5 : Предполагая, что SSH URI на gitorious для вашего проекта - «git@gitorious.org: project / project.git», в локальном хранилище определите новый удаленный «autopush» с немного измененное имя хоста:

git remote add autopush git@robot.gitorious.org:project/project.git

Настройка завершена, теперь попробуйте нажать на gitorious с помощью пульта 'autopush'.

git push autopush master

Если все прошло хорошо и есть изменения, которые нужно нажать, вы должны увидеть, что вы успешно переведены на «gitorious.org» как «робот»

[1] Для автоматических нажатий для учетной записи должен быть сгенерирован пароль без пароля, но присоединение его к учетной записи «разработчика» будет означать, что автоматизированное задание может распространяться на любой из gitourious проектов, где «разработчик» участвует в gitorious.

...