git клонировать с локального на удаленный

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

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

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

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

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

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

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


person hlidotbe    schedule 10.11.2010    source источник
comment
Вам нужно создать голое репо и git-хук на ssh-сервере, чтобы иметь возможность отправлять с локального: bobbelderbos.com/2012/03/push-code-remote-web-server-git   -  person Carlos Mendoza    schedule 04.02.2021


Ответы (6)


Отвечая на ваш первый вопрос, да, вы можете. Предположим, что удаленный каталог 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

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

person cdhowie    schedule 10.11.2010
comment
в качестве дополнения, в git push я привык указывать ветку, на которую я нажимаю. Таким образом, ваш оператор push в моем случае будет читать git push --all origin master - person iGbanam; 10.11.2010
comment
Если вы хотите это сделать, удалите --all, иначе git все равно их всех вытолкнет. :) - person cdhowie; 10.11.2010
comment
Спасибо за ответ. Первая часть работает нормально, хотя я получаю предупреждение об обновлении текущей ветки при нажатии (на голых репозиториях, которые исчезают). Что касается второй части, я, возможно, что-то упустил. После git init мне пришлось войти в .git, иначе не работала бы информация о сервере обновлений. После этого перехватчики после получения, похоже, работают, но не удаляют файлы, а только помечают их как неотслеживаемые (hg update приведет меня в правильное состояние, если на удаленном компьютере не было изменений). - person hlidotbe; 10.11.2010
comment
Попробуйте добавить git clean -fd сразу после проверки в скрипте ловушки. Обратите внимание, что это приведет к удалению всех неотслеживаемых файлов, которые не соответствуют шаблону .gitignore, поэтому убедитесь, что любые файлы конфигурации сервера соответствующим образом игнорируются, если вы хотите их сохранить. - person cdhowie; 10.11.2010
comment
ммх, это может сработать, но это означает, что если пользователь добавит несколько файлов (используя ftp), они будут удалены. С mercurial обновление объединяет удаленный рабочий каталог с новыми наборами изменений, и я получаю обратную связь, если это не удается (тогда мне приходится выполнять слияние вручную на сервере, но это редко). Пока обойдусь без очистки и покопаюсь в git, когда будет больше времени. Спасибо еще раз! - person hlidotbe; 10.11.2010
comment
Без проблем. Что бы это ни стоило, я использую git для развертывания, но у меня есть развернутый репозиторий, извлеченный из основного репозитория. Отправка ветки в не голый репозиторий, когда в этом репозитории эта ветка извлечена, просто напрашивается на неприятности. - person cdhowie; 10.11.2010
comment
В отличие от hg clone, ответ на первый вопрос не работает, если удаленный репозиторий git еще не существует. См. лучший ответ @OOPMan для этого. - person Yitz; 12.11.2014
comment
@cdhowie: что, если у меня есть доступ только к оболочке на сервере? Я не смогу оформить заказ? - person user2284570; 13.11.2015
comment
или менее с сохранением состояния на локальной машине GIT_SSH_COMMAND='ssh -i ~/.ssh/<somekey> -l <someuser>' git push <somehost> HEAD:FETCH_HEAD; после инициализации удаленного репо, а затем удаленно проверить FETCH_HEAD - person ThorSummoner; 21.08.2018
comment
Вы пропустили 1 # git add . 2# git совершить? - person Asher; 15.04.2021
comment
@ Ашер Нет, я этого не делал. - person cdhowie; 16.04.2021

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

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

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

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

1: перейдите в каталог проекта git
2: git remote add bare ssh://user@server/tmp/bare
3: git push --all bare
4: git remote remove голый

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

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

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

1: git remote add origin ssh://user@server/path/to/your/clone

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

person OOPMan    schedule 28.09.2013
comment
Поскольку вы заявили, что это безопасно, я попробовал. Кажется, это работает (для меня). - person Nikos Alexandris; 22.11.2013
comment
проще, чем кажется - person John Mee; 29.06.2018

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

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

person AmaDaden    schedule 08.04.2012

Самый простой 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"

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

person presto8    schedule 02.03.2013

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

rsync -avz . ssh://account@server/www/reponame --delete
person jlettvin    schedule 03.10.2013

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

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

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

person dani24    schedule 06.10.2015