git force push текущий рабочий каталог - PullRequest
11 голосов
/ 22 августа 2011

Мне нужно сделать git push для удаленного доступа, и этот push должен быть текущей рабочей копией.Потому что отправленный источник - это веб-хостинг.Таким образом, отправленные файлы должны быть использованы в данный момент.Я уверен, что никто не будет редактировать файлы на хосте:)

Этот вопрос является продолжением этих 2 вопросов, Возможно ли иметь git-репо внутри другого git-репо и * 1005?* Какое значение имеет переключатель --bare при запуске git-репо?

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

Edit2: Насколько я понимаю, голое хранилище не хранит файл в архиве и хранит данные хранилища в корневом каталоге

Ответы [ 3 ]

10 голосов
/ 22 августа 2011

Ниже приведено пошаговое руководство по созданию git-репо на вашем веб-хосте, которое будет разрешать прямые пуски, устанавливать его в качестве удаленного для локального репо и вносить в него изменения. Обратите внимание, что вам нужно иметь доступ по ssh к вашему веб-хосту и установить git.

На вашем веб-хосте (ssh'd in):

# create an empty repo on  your web host; note its path
mkdir site
cd site
git init

# configure it to allow pushes to the current checked-out branch
# without complaining (direct push)
git config receive.denyCurrentBranch ignore

Теперь с вашим локальным репо (запустите эти команды git внутри репо):

# create the reference to the web host remote for pushing
# /path/to/the/repo is the path to the repo you made above on the web host:
# it will be an absolute path OR relative to your ssh chroot (depends on the host)
git remote add deploy ssh://your_user@your_host/path/to/the/repo

# finally, push your changes!
git push deploy master

Теперь ваши изменения перенесены в извлеченный репозиторий на веб-хосте. Однако они не будут отражены в рабочем каталоге (т. Е. Ваши изменения вступят в силу не сразу). Это потому, что вы перешли прямо к активной ветке Чтобы закончить, вам нужно либо

  • вручную выполнить git checkout -f для обновления рабочего каталога
  • сделать крюк git post-receive, чтобы сделать это автоматически.

Чтобы получить мгновенное автоматическое развертывание с помощью post-receive, воспользуйтесь этим развертыванием git-сайта howto.

6 голосов
/ 14 июля 2016

Этот вопрос действительно старый, но я нашел гораздо лучшее решение (по крайней мере, для моей ситуации), чем решения, перечисленные здесь.

Из руководства для git config, начиная с Git 2.3.0:

Другой вариант - «updateInstead», который обновит рабочий каталог (должен быть чистым), если нажать на текущую ветку. Эта опция предназначена для синхронизации рабочих каталогов, когда одна сторона не легко доступна через интерактивный ssh ​​(например, живой веб-сайт, поэтому необходимо, чтобы рабочий каталог был чистым).

Итак, git config receive.denyCurrentBranch updateInstead (в принимающем репозитории) отлично сработал для меня. Это позволяет мне принудительно и автоматически обновлять рабочий каталог принимающего репозитория (до тех пор, пока этот рабочий каталог чист, когда происходит push).

4 голосов
/ 18 октября 2013

Несмотря на то, что он довольно старый, крайне нежелательно переходить к рабочему дереву.https://git.wiki.kernel.org/index.php/GitFaq#Unexpected_behavior

Лучшим способом было бы создать голое хранилище, отражающее рабочее дерево веб-сайта.

Все, что нужно, - это хранилище без рабочего дерева или, скорее, без проверенных файлов.из.Иерархия существует с учетом всех вещей и может быть проверена.Другими словами, он выступает в роли хоста только для изменений.

Не зная иерархии каталогов, с которой вы работаете для своего веб-сайта, я предполагаю, что это стандартный макет веб-сайта с использованием chrooted home EG: / home /user / www

На сервере, использующем ssh с установленным git:

Создать рабочее дерево текущего сайта

cd /home/user/public_html
git init
git add .
git commit -m "Initial Commit"

Создать пустой репозиторий для удаленной отправки изваша локальная система

mkdir /home/user/deploy.git
cd /home/user/deploy.git
git init --bare

Свяжите ваш репозиторий рабочего дерева и ваш репозиторий голого развертывания

cd /home/user/public_html
git remote add deploy /home/user/deploy.git
git remote show deploy
* remote deploy
  URL: /home/user/deploy.git
git push deploy master

Теперь настройте новое репо в вашей локальной системе

git clone ssh://user@example.com/home/user/deploy.git
git branch -a
 *master
  remotes/origin/HEAD
  remotes/origin/master

Теперь мы настроили 2 хука, чтобы мгновенно вносить изменения в ваше удаленное веб-репо, когда вы нажимаете на него или если кто-то другой, кому вы предоставляете доступ, нажимает на него.Поскольку игнорирование git config receive.denyCurrentBranch приведет к проблемам в долгосрочной перспективе

На удаленном сервере включите пост-обновление для развертывания

cd /home/user/deploy.git/hooks
mv post-update.sample post-update
vi post-update

Измените хук после обновления на приведенный ниже иsave

#!/bin/sh
echo "Pulling changes into public_html [deploy post-update]"
cd /home/user/public_html || exit
unset GIT_DIR
git pull deploy master
exec git update-server-info

Теперь мы настроили ваше рабочее веб-дерево, чтобы подтолкнуть его изменения к развертыванию, если что-то зафиксировано в нем.

cd /home/user/public_html/.git/hooks
mv post-commit.sample post-commit
vi post-commit

Затем измените хук после фиксации на следующий

#!/bin/sh
echo "Pushing changes to deploy [public_html post-commit]"
git push deploy

У вас все еще есть возможность оформить рабочее веб-дерево, если это необходимо.Это позволит вам перенести ваши изменения из развертывания в рабочее дерево вашей сети, когда вы нажмете мастер своей локальной системы.Вы можете выполнять ветвление, перебазирование, возврат и т. Д., Не затрагивая рабочее дерево вашей сети, не беспокоясь о маркерах конфликтов, вместо этого просто используя простой репозиторий развертывания.Если вам нужен больший контроль над тем, что совершено, вы можете использовать пост-получение вместо пост-обновления или вместе с ним.

Надеюсь, это поможет кому-то еще, желающему сделать то же самое, что и ОП.

...