Git создать удаленный репозиторий на push - PullRequest
26 голосов
/ 05 ноября 2010

Я пытался понять это, но мне трудно это сделать.В настоящее время я работаю над проектом с открытым исходным кодом, который требует, чтобы я разрешил пользователю отправить в удаленный репозиторий без , который там уже существует.Я хочу избежать ручного входа на сервер и запуска 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 локально, но я не смогt понять это.

Любая помощь будет высоко ценится!

Спасибо!

Ответы [ 4 ]

26 голосов
/ 05 ноября 2010

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

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

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

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

8 голосов
/ 04 мая 2013

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

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 для демонстрации.Обратите внимание, что я не тестировал его, и есть возможности для улучшения (например, мы не должны жестко кодировать /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's 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

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

6 голосов
/ 05 ноября 2010
  1. Оформление и отслеживание ветви с пульта:

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

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

    git push origin mybranch
    

Там должно быть написано "создан новый источник удаленной ветки \ mybranch"

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

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

2 голосов
/ 14 июня 2012

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

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

...