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