Не удается скопировать папку на сервере, а затем отредактировать и нажать 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тогда он откажется, потому что это не "голое хранилище".

Есть ли способ

  1. В любом случае, как Hg?
  2. Или, еще лучше, нажмите его и сделайте так, чтобы он автоматически делал что-то вроде 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 не поддерживает отправку на ветку, которая проверена на удаленном конце.

Рекомендуемый способ - использовать пустой репозиторий на сервере. Обычно вы либо перемещаетесь в хранилище (и обнажаете его), либо работаете с ним, но не с обоими. Даже если вы хотите иметь рабочую копию на сервере, я бы посоветовал вам взглянуть на этот вопрос.

Итак, у вас есть два варианта:

  1. Сделать голый репозиторий (mysite.com.git) и непокрытое хранилище (mysite.com). В голом хранилище добавьте post-update зацепить git --git-dir=.../mysite.com pull
  2. Сделайте только один репозиторий и:

    1. Отделить голову: git checkout master@{0}

    2. Добавить post-update зацепить git merge master

    Причина в том, что git отказывается модифицировать извлеченную ветку, но если вы отмените ветку, вы сможете нажать. И вы сможете обновить рабочий каталог с помощью ловушки (ловушка - это скрипт, помещенный в hooks каталог в хранилище). Вы можете либо создать отдельную ветку и проверить это, либо использовать состояние "detached HEAD" (как предложено выше - git запоминает, какая ветка извлечена, имея специальную ссылку "HEAD", которая указывает на ветку, но если Вы извлекаете что-то, что не является ветвью, это делается для того, чтобы указывать на ревизию напрямую, и это называется "отдельная ветвь", и, поскольку ни одна ветвь не извлечена, вы можете перейти к любой из них).

Вам следует только нажать на пустые репозитории (пустой репозиторий не имеет рабочей копии).

У вас есть два решения:

  • вытащить из вашего удаленного хранилища (тогда он попросит разрешения конфликтов)
  • сделать ваш удаленный репозиторий пустым

РЕДАКТИРОВАТЬ мое предположение, что удаленное репо имеет локальные модификации, неверно; Я не знаю, почему вы не можете нажать, но остальная часть моего поста остается в силе: вы не должны нажимать на обычные репо.

Другие вопросы по тегам