По сути, я хотел бы настроить хранилище на удаленном сервере на лету. Обычно репозиторий необходимо инициализировать на удаленном компьютере с помощью init --bare прежде чем можно будет отправлять коммиты с другого устройства. Есть ли способ обойти это?

В идеале у меня есть два момента, которые я хотел бы выполнить:

  1. Оставьте клиентскую сторону без изменений, что означает отсутствие настроек, кроме git remote add ...
  2. Используйте SSH в качестве протокола передачи.

Что я думал до сих пор:

  1. Игнорирование спроса по SSH. Вместо этого нажав HTTPS, я мог бы разместить сервер HTTPS, который инициализирует несуществующие репозитории, прежде чем принять push.

  2. Изменение функциональности git на стороне сервера, перехват команд push (называемых в git-shell?). Я не нашел никакой документации о том, что происходит на стороне сервера при передаче по SSH, поэтому я не смог дополнительно исследовать это возможное решение.

  3. Что касается # 2, я мог бы реализовать SSH-сервер, работающий на удаленном компьютере, инициализируя несуществующие репозитории перед выполнением дальнейших команд. Но, как и в случае с № 2, я не нашел документации по push-конвейеру.

Разъяснение:

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

1 ответ1

0

В итоге решение было основано на # 2:

Изменение функциональности git на стороне сервера, перехват команд push (называемых в git-shell?). Я не нашел никакой документации о том, что происходит на стороне сервера при передаче по SSH, поэтому я не смог дополнительно исследовать это возможное решение.

Я нашел статью "kamalmarhubi", в которой объяснялось, что делает git push при настройке на использование SSH.

Решение

Настройка - на стороне сервера

Добавьте б под названием git:

sudo useradd -m git

Обратите внимание, что пользователь, к сожалению, не может использовать git-shell, так как оболочка обрабатывает необходимые команды внутри.

Создайте .ssh

mkdir .ssh

Создайте файл authorized_keys ключи

touch .ssh/authorized_keys

Добавьте любые открытые ключи, которые вы собираетесь использовать в качестве строки, в файл authorized_keys .

Добавьте следующее поверх файла .bashrc пользователя:

function git-receive-pack() {
  if [ ! -d $1 ]; then
    mkdir -p $1 && cd $1 && git init --quiet --bare && command git-receive-pack $@
  fi
}

Настройка - на стороне клиента

Выполните следующее в любом git-репозитории:

git add remote origin git@server:directory

Где server - это ip или имя сервера и directory в котором хранится хранилище (относительно домашнего каталога пользователя git, обычно /home/git/).

использование

Pushing код от клиента

Нажмите как обычно, служба позаботилась об инициализации хранилища для вас!

Как это устроено

Всякий раз, когда Git проталкивает SSH, он вызывает ssh git@server git-receive-pack directory , т.е. запускает каталог git-receive-pack directory на удаленном компьютере. При использовании git-shell команда обрабатывается внутри. При использовании обычной оболочки (bash) команда обрабатывается как любая другая команда bash. Это означает, что мы можем переопределить работу команды, что мы и делаем, определяя наш собственный git-receive-pack в .bashrc . Определение должно быть в верхней части файла, поскольку .bashrc обычно прерывает выполнение, если он запускается в неинтерактивной оболочке (как в Git). Команда, которую мы определяем, проверяет, существует ли целевой репозиторий, если нет, то инициализирует его как пустой репозиторий (в соответствии со стандартом Git), прежде чем запустить оригинальный git-receive-pack который позаботится о фактическом отправлении. ,

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .