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

Git клон от локального до удаленного

Мы переходим от Mercurial до Git для нашего рабочего процесса, и у меня есть две незначительные проблемы.

Во-первых, возможно ли "клонировать" локальный репозиторий непосредственно в пустой пул (ssh)?

В настоящее время, когда мы создаем новый сайт, мы в основном клонируем нашу CMS локально, настраиваем его, а затем клонируем его на центральном репо и на веб-сервере (hg clone . ssh://[email protected]/www). Таким образом, у нас есть мгновенный доступ к толчке.

Это приводит ко второму вопросу, удаленное развертывание.

В настоящее время с Mercurial у меня есть простые крючки в удаленных репозиториях, которые выполняют hg up при получении набора изменений.

Чтобы сделать то же самое с Git, я выполнил следующие инструкции: http://caiustheory.com/automatically-deploying-website-from-remote-git-repository, но я хотел бы сохранить .git в корне сайта, как в случае с Mercurial (он защищен конфигурацией Apache, и я не могу экспортировать GIT_DIR для всех учетных записей, поскольку некоторые из них имеют более одного сайта/репозитории).

Возможно ли иметь в основном одну и ту же установку без разделения рабочего каталога из репозиториев?

4b9b3361

Ответ 1

Чтобы ответить на ваш первый вопрос, да, вы можете. Предположим, что удаленный каталог ssh://[email protected]/home/user/repo. Это должен быть репозиторий git, создать с помощью git init --bare или scp локальный каталог repo.git (может быть создан с git clone) на удаленном компьютере. Затем выполните:

git remote add origin ssh://[email protected]/home/user/repo
git push --all origin

Это приведет к удалению всех локально существующих ветвей в удаленный репозиторий.

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

$ cd /var/www  # or wherever
$ mkdir somesite
$ cd somesite/
$ git init
$ git --bare update-server-info
$ git config receive.denycurrentbranch ignore
$ cat > hooks/post-receive
#!/bin/sh
git checkout -f
^D
$ chmod +x hooks/post-receive

Вы, конечно, запустили бы команды remote/push выше после этого шага. Возможно, вам придется проверить конкретную ветку после этого, так что клон "somesite" на сервере действительно знает, какую ветку следовать. С этого момента нажатие на этот репозиторий должно инициировать повторную проверку этой ветки.

Ответ 2

Недавно я столкнулся с этой проблемой и решил ее следующим образом:

На удаленном сервере:

1: Создайте каталог с именем /tmp/bare
2: переход в этот каталог
3: Выполнить git init --bare

На локальной машине:

1: перейдите в каталог проекта git

2: git удаленный добавить голый ssh://user @server/tmp/bare
3: git push - all bare
4: git удаленный удалить голый

На удаленном сервере:

1: git clone/tmp/bare/path/to/your/clone

На локальной машине:

1: git удаленный добавочный источник ssh://user @server/path/to/your/clone

Это немного связано, но оно работает и не требует установки каких-либо странных флагов или указания git переопределить его поведение по умолчанию. Это, следовательно, вполне безопасно.

Ответ 3

Этот ответ хорош, но я не смог заставить его работать для меня. Следующий код из этой ссылки сделал http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-push/. На дистанционном запуске

mkdir my_project.git
cd my_project.git
git init --bare
git-update-server-info # If planning to serve via HTTP

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

git remote add origin [email protected]:my_project.git
git push -u origin master

Я надеюсь, что это поможет любому, у кого возникли проблемы с другим ответом.

Ответ 4

Самый простой git эквивалент hg clone . ssh://[email protected]/www:

rsync -avz . ssh://[email protected]/www/reponame

Фактически, я добавил эту строку в ~/.bash_aliases, чтобы зеркалировать любой каталог в любом месте:

alias mirror="rsync -avz . ssh://[email protected]`pwd` --delete"

Это может оказаться опасным, если вы попадаете в специальный каталог, например /dev или/bin. Будьте осторожны.

Ответ 5

Я соглашаюсь и улучшаю presto8, удаляя непревзойденные файлы.

rsync -avz . ssh://[email protected]/www/reponame --delete

Ответ 6

Чтобы дать вам альтернативу, вы можете использовать:

git remote set-url origin git://other.url.here

Они также работают, если ваш локальный репозиторий git указывает на другой удаленный репозиторий