Подтвердить что ты не робот

Git создать удаленный репозиторий при нажатии

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

По очевидным причинам я получаю следующую ошибку при попытке перенаправить мой локальный репозиторий на путь, который не указывает на существующий репозиторий на удаленном сервере:

fatal: '/var/repositories/myrepo' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Но я хотел бы запустить, например, следующую команду:

git push origin master

И создайте /myrepo в /var/repositories, если он еще не существует. Как я смогу это сделать? Я бы предположил, что это какой-то параметр (глобальный) git config, который вы, вероятно, установили бы на удаленном сервере, или иначе (конкретный репозиторий) git config локально, но я не мог понять это.

Любая помощь будет очень признательна!

Спасибо!

4b9b3361

Ответ 1

  1. Оформить заказ и отследить ветку с пульта:

    git checkout -t origin/funbranch
    
  2. Ответвление от него:

    git checkout -b mybranch
    
  3. Поднимите новый, он автоматически создаст новую ветку на пульте:

    git push origin mybranch
    

Должно быть написано "создана новая удаленная ветка origin/mybranch"

Если вы все еще получаете "Удаленный конец повесил pipeку", это звучит как вопрос безопасности. Правильно ли установлены ключи SSH и есть ли права на запись на удаленном сервере?

Как работает большинство проектов с открытым исходным кодом, вы должны создать форк (клон по своей сути), который вы используете для своей работы, потому что большую часть времени у вас нет прав на запись в репозиторий. Если у вас есть изменения, вы отправите запрос на извлечение владельцу хранилища, и он/она извлечет из вашей ветки изменения, которые они хотят.

Ответ 2

В настоящее время нет способа использовать git push для создания хранилища на удаленном компьютере. Лучшее, что вы можете сделать, - это написать однострочный скрипт примерно так:

#!/bin/bash
ssh $1 "git init --bare $2" &&
git push ssh://$1/$2

Надеюсь, ты сможешь войти в ssh; если вы не можете, вы можете использовать какой-то доступ к файловой системе, чтобы просто вручную создать репо, поместив дамп в соответствующую структуру файла/каталога (возможно, создайте его локально и скопируйте). Вы также можете создать именованный пульт по пути.

На самом деле это была одна из самых запрашиваемых функций в Git Survey 2010 года - так что, возможно, вы исполните свое желание в следующем году!

Ответ 3

Вы можете написать обертку script на пульте дистанционного управления и добавить команду = "/path/to/wrapper" в строки authorized_keys.

command="/usr/local/bin/gitaccess" ssh-rsa ...

В этой оболочке вы проверите SSH_ORIGINAL_COMMAND. Git выдает следующие команды:

git receive-pack '/path/provided' # when pushing
git upload-pack '/path/provided' # when pulling

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

Если SSH_ORIGINAL_COMMAND пуст и вы хотите предоставить пользователям доступ к оболочке, вы вызываете оболочку.

Если SSH_ORIGINAL_COMMAND не пуст, но не запускается с помощью команды Git, если вы хотите разрешить пользователям доступ к оболочке, вы просто выполняете предоставленную команду.

Здесь немного кода Ruby для демонстрации. Обратите внимание, что я не тестировал его и там было место для улучшения (например, мы не должны делать hardcode/bin/ bash).

#!/usr/bin/env ruby
orig_command = ENV['SSH_ORIGINAL_COMMAND']
if orig_command.nil?
    # If you want to preserve shell access
    exec '/bin/bash' # not tested, I hope it interactive if executed this way
end

cmd_parts = orig_command.match /([a-z-]+) '([a-z0-9.\/]+)'/
if cmd_parts.nil?
    # If you want to preserve shell access
    exec '/bin/bash', '-c', orig_command
end

command = cmd_parts[1]
path = '/var/repositories/'+cmd_parts[2] # not secured (could contain '..')

if command == 'git-receive-pack' || command == 'git-upload-pack'
    if not File.directory?(path)
        `git init --bare #{path}` # not secured, I didn't escape path
        # Do any configuration here
    end
    exec 'git-shell', '-c', "#{command} '#{path}'"
end

# If you want to preserve shell access
exec '/bin/bash', '-c', orig_command

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

Ответ 4

Я знаю, что это старый вопрос, но я наткнулся на это, когда искал что-то еще.

Лучший способ найти удаленный сервер и создать репозиторий, если он не существует, - использовать gitolite. Посмотрите на руководства по установке для него, это очень легко настроить, и если вы измените некоторые настройки конфигурации, вы можете использовать его для выхода /var/repositories для хранения репозиториев.