мерзавец клон с локального на удаленный - PullRequest
27 голосов
/ 10 ноября 2010

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

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

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

Это подводит меня ко второй проблеме, удаленному развертыванию.

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

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

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

Ответы [ 6 ]

39 голосов
/ 10 ноября 2010

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

git remote add origin ssh://user@host/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

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

24 голосов
/ 28 сентября 2013

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

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

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

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

1: Перейдите в каталог вашего git проекта
2: git remote add bare ssh: // пользователь @ сервер / tmp / bare
3: git push - все оголено
4: Git Remote удалить голые

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

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

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

1: git remote add origin ssh: // пользователь @ сервер / путь / к / вашему / клону

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

4 голосов
/ 08 апреля 2012

Этот ответ хорош, но я не смог заставить его работать на меня. Следующий код по этой ссылке сделал 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 git@example.com:my_project.git
git push -u origin master

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

3 голосов
/ 02 марта 2013

Простейший git, эквивалентный hg clone . ssh://account@server/www:

rsync -avz . ssh://account@server/www/reponame

На самом деле я добавил эту строку в ~ / .bash_aliases для зеркалирования любого каталога в любом месте:

alias mirror="rsync -avz . ssh://account@server`pwd` --delete"

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

1 голос
/ 03 октября 2013

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

rsync -avz . ssh://account@server/www/reponame --delete
0 голосов
/ 07 октября 2015

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

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

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

...