Не удается скопировать папку на сервере, а затем отредактировать и нажать git?
Я использовал Mercurial (Hg) раньше, и было нормально делать что-то вроде на локальном ПК:
hg clone ssh://peter@hostingcompany.com/~/mysite.com
а затем будет иметь локальную папку с именем mysite.com
и я могу редактировать его содержимое, коммитить и сказать hg push
и отправить его на сервер. Конечно, чтобы содержимое отображалось в "рабочем каталоге", мне придется ssh
там и сделать hg up
,
С Git, если я делаю то же самое, на сервере, сделайте
git init
git add .
git commit -m "ok"
и на локальном ПК сделайте
git clone ssh://peter@hostingcompany.com/~/mysite.com
но когда я редактирую файл и git push ssh://peter@foo.com/~/mysite.com master
тогда он откажется, потому что это не "голое хранилище".
Есть ли способ
- В любом случае, как Hg?
- Или, еще лучше, нажмите его и сделайте так, чтобы он автоматически делал что-то вроде
hg up
-- этоgit checkout
, так что контент сразу становится визуальным на mysite.com (используя любой веб-браузер в любом месте).
Обновить:
Кажется, что обычной практикой является продвижение к голому репо... но разве мы не можем использовать голое репо и заставить (2) работать выше? Если это практичный способ, то нам не нужно придерживаться правила "push to bare repo"?
Если есть еще одна причина, по-прежнему подталкивать к пустому репо и клонировать на сервере... тогда:
если на сервере есть каталоги, такие как ~/mysite.com
а также ~/other_folder
и т. д., тогда где репо для mysite.com
сидеть? mysite.com
содержание сайта, так что если я поставлю index.html
Тогда любой браузер в мире сможет это увидеть. Так хорошо ли создавать голый репо, пусть ~/mysite.com
клон с него и на локальный ПК используй git push <path> master; ssh <path> "cd to that folder and do git checkout to update the content"
автоматически по 1 строке на локальном ПК? Будет ли линия git push ssh://peter@hostingcompany.com/~/mysite.com master; ssh ssh://peter@hostingcompany.com/~/mysite.com 'git pull; git checkout'
?
5 ответов
Я не знаю, почему люди говорят, что это не поддерживается. Рекомендуется практиковаться в открытии репо, но вы можете подтолкнуть к голому репо, установив receive.denyCurrentBranch
Переменная config 'игнорировать' или 'предупреждать', как показано сообщением об ошибке, которое вы получаете (по крайней мере на 1.7.1), когда вы пытаетесь это сделать:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
Я бы сказал, что ваш рабочий процесс, в котором вы выполняете развертывание с помощью git push, за которым следует жесткий сброс на удаленной стороне, является именно исключением из правила, для которого была создана эта переменная конфигурации.
Кроме того, я не пробовал это лично, но язык "текущей ветки" подразумевает, что вы можете переместиться в удаленную ветку, которая не была проверена без ошибок, после чего вы можете выполнить быструю слияние на удаленной конец в вашу проверенную ветку.
В Git обычно хорошей практикой является размещение репозитория на сервере, к которому другие люди стремятся стать пустым репозиторием. Настоятельно рекомендуется.
git init . --bare
Здесь это терпит неудачу, потому что вы продвигаетесь к не-голому (с рабочей копией) репо и к извлеченной ветви.
В Git вы должны только перейти к пустому хранилищу. Лучшее решение - создать на сервере, к которому вы отправляете, пустой репозиторий, а затем его непонятный клон, содержащий извлечение, поэтому после того, как вы перешли в репозиторий с открытым исходным кодом, вы подключаетесь к серверу по SSH и делаете git pull
из репозитория non-bare (или установите хук, чтобы сделать это автоматически после того, как репо голого игрока получит новую версию).
Git не поддерживает отправку на ветку, которая проверена на удаленном конце.
Рекомендуемый способ - использовать пустой репозиторий на сервере. Обычно вы либо перемещаетесь в хранилище (и обнажаете его), либо работаете с ним, но не с обоими. Даже если вы хотите иметь рабочую копию на сервере, я бы посоветовал вам взглянуть на этот вопрос.
Итак, у вас есть два варианта:
- Сделать голый репозиторий (
mysite.com.git
) и непокрытое хранилище (mysite.com
). В голом хранилище добавьтеpost-update
зацепитьgit --git-dir=.../mysite.com pull
Сделайте только один репозиторий и:
Отделить голову:
git checkout master@{0}
Добавить
post-update
зацепитьgit merge master
Причина в том, что git отказывается модифицировать извлеченную ветку, но если вы отмените ветку, вы сможете нажать. И вы сможете обновить рабочий каталог с помощью ловушки (ловушка - это скрипт, помещенный в
hooks
каталог в хранилище). Вы можете либо создать отдельную ветку и проверить это, либо использовать состояние "detached HEAD" (как предложено выше - git запоминает, какая ветка извлечена, имея специальную ссылку "HEAD", которая указывает на ветку, но если Вы извлекаете что-то, что не является ветвью, это делается для того, чтобы указывать на ревизию напрямую, и это называется "отдельная ветвь", и, поскольку ни одна ветвь не извлечена, вы можете перейти к любой из них).
Вам следует только нажать на пустые репозитории (пустой репозиторий не имеет рабочей копии).
У вас есть два решения:
- вытащить из вашего удаленного хранилища (тогда он попросит разрешения конфликтов)
- сделать ваш удаленный репозиторий пустым
РЕДАКТИРОВАТЬ мое предположение, что удаленное репо имеет локальные модификации, неверно; Я не знаю, почему вы не можете нажать, но остальная часть моего поста остается в силе: вы не должны нажимать на обычные репо.