Проблемы с отправкой нового репо на сервер Synology git

#git #synology

Вопрос:

Я недавно настроил git на сетевом накопителе Synology (DS2220j, если это имеет значение) и успешно настроил такие вещи, Как использование открытых ключей и т. Д., И могу отправлять обновления в хранилище, которое существует на самом сервере Synology.

Моя настройка заключается в том, что у моего собственного пользователя на диске Synology есть каталог git в его домашнем каталоге. Я выполняю следующее, чтобы создать репо:

 ssh user@NAS
cd git
git init --bare repo.git
 

Затем я могу запустить локально

 cd repo
git remote add origin user@NAS:git/repo.git
git push --set-upstream origin master
 

и это отлично подтолкнет мое репо к серверу git. Моя проблема в том, что я хочу пропустить начальный шаг, на котором я подключаюсь по ssh к диску Synology, так как на самом деле я не хочу напрямую подключаться по ssh к интерактивной оболочке в качестве своего пользователя. Однако, если я пропущу этот шаг, я получу следующий результат:

 fatal: 'git/repo.git' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.
 

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

Комментарии:

1. Git сам по себе не может создать новый репозиторий самостоятельно, как это, поэтому любой сервер, который может это сделать, должен сделать это, заметив, что репозитория еще нет, и еще не запустил обычное программное обеспечение для приема push, но вместо этого сначала запустил все mkdir необходимые (если это необходимо/разрешено), а затем запустил соответствующий git init --bare . Так что для этого определенно потребуется что-то особенное со стороны синологии.

2. @torek Конечно, это то, за что будет отвечать серверный пакет git. Например, с помощью gitolite вы можете сделать пользователя СОЗДАТЕЛЕМ, а затем разрешить ему отправлять любое репо, соответствующее регулярному выражению, независимо от того, существует оно уже или нет. Во многих руководствах по git Synology показано, что добавление новых репозиториев к пути, по которому может писать ваш пользователь, «просто работает», поэтому я использую собственный домашний каталог пользователя и спрашиваю, как я мог что-то неправильно настроить.

Ответ №1:

Вы можете полностью контролировать, что разрешено делать комбинации пользователь/ключ, настроив ~/.ssh/authorized-keys файл этого пользователя для этого ключа. Поставь

 command="bin/checkcommand" ssh-ed25519 AAAAC3NklC1wZDI1NTE5AAAAIH5NBbarfcodeFWkCC6KKU8qYLBNpnYWXHpxwcTKBesu you@example.com
 

в нем и всякий раз, когда вы входите в систему как этот пользователь с этим ключом, они bin/checkcommand будут запускаться с SSH_ORIGINAL_COMMAND настройкой на все, что было в ssh командной строке, поэтому вам придется в основном выполнить простой анализ команд, чтобы разрешить даже git-upload-pack и git-receive-pack если вы хотите, чтобы они могли извлекать или нажимать.

Скажем man sshd , и поищите command= стартовый комплект, из которого я пишу, я не проверял, но я бы поставил деньги на то, что gitolite и так далее используют именно этот механизм.

bin/checkcommand может выглядеть немного так, но с белым списком команд он будет выполняться, а не выполнять все, что вы в него бросаете:

 #!/bin/bash -e
set -o pipefail;

echo command="${SSH_ORIGINAL_COMMAND}" >> ~/.ssh/log; 

# Up to the first space is the command
case $(echo "${SSH_ORIGINAL_COMMAND}" | cut -f 1 -d ' ') in
    "git-receive-pack" | "git-upload-pack")
        # Second part is the git directory, contained within quotes
        GITDIR="$( 
            echo "${SSH_ORIGINAL_COMMAND}" 
                | cut -f 2- -d " " 
                | cut -f 2 -d "'" 
        )";
        echo "git at ${GITDIR}" >> ~/.ssh/log;

        if [ ! -d ${GITDIR} ]; then
            git init --bare ${GITDIR} 2>amp;1 >> ~/.ssh/log;
        fi
    ;;  
esac

bash -c "${SSH_ORIGINAL_COMMAND}" | tee -a ~/.ssh/log;
 

Комментарии:

1. Это хороший намек на ответ, но на самом деле этого недостаточно, чтобы решить проблему для обычного пользователя, проезжающего мимо. Я постараюсь разобраться в этом в ближайшее время, и если я смогу найти простой способ заставить нас работать, я обновлю и приму, но если у вас есть еще что добавить, буду признателен.

2. Вы на самом деле не сказали, как вы хотите, чтобы это работало, поэтому трудно сказать, что входит в команду ~thatuser/bin/check. Например: было бы довольно легко настроить пользователя linux, поэтому newrepo reponame создайте новое репозиторий с этим именем на nas, установив newrepo в качестве псевдонима ssh thenas и thenas в .ssh/config сочетании с пользователем, хостом и ключом, которые вы настроили для выполнения этой команды проверки. Посвятите ключ созданию репо, и ничто другое даже не должно знать, что эта настройка вообще существует.

3. Я думал, что да, возможно, слишком неявно. Когда вы пытаетесь отправить несуществующее репо, оно выполняет необходимые git init --bare действия, а затем обрабатывает команду push, как обычно.

4. Чтобы добавить еще немного объяснений: я думаю, что можно предположить некоторые знания о сценариях, но мало кто точно знает, какие команды отправляются по ssh, когда вы выполняете git-push. Я, конечно, не делаю этого без ссылок на справочные страницы, пока я это делаю, и совершаю множество ошибок, прежде чем пойму это правильно 😉

5. Ах. Хорошо. Я вижу, что в вашем вопросе сейчас создание путем нажатия было для меня такой чуждой идеей, что мне нужно было немного более четко, э-э, подтолкнуть? . . . в любом случае, для этого потребуется интерфейс git-receive-pack на сервере. Таким образом, вы можете использовать command= брандмауэр при каждом подключении и уведомлять его, когда запрашиваемый git-receive-pack ссылается на несуществующее хранилище, а затем инициализировать его перед выполнением команды.