В репозиториях CentOS 6 лежит уже довольно старая версия пакета git-1.7.1-3
Все бы с ним хорошо, да есть один баг из-за которого в нем не работает хук из вот этой заметки: http://mrdeveloper.ru/post-36/git-deploy-hooks
Он ругается вот так:
remote: fatal: /usr/libexec/git-core/git-pull cannot be used without a working tree.
Ну что же, настало время исправить эту ополошность. Обновим git из репозитория GitLab.
wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/install/centos/PUIAS_6_computational.repo
wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-puias http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-puias
rpm -qa gpg*
yum repolist
yum --enablerepo=PUIAS_6_computational install git
git --version
В итоге получаем вполне рабочий git 1.8.3.1
Краткий совет как на сервере с ISPmanager глобально запретить отображать листинг директорий .git
- Открываем /etc/apache2/apache2.conf
- Находим начало секций с
<Directory>
и вписываем туда глобальное правило:
<Directory /var/www/\*/data/www/*/.git>
order allow,deny
deny from all
</Directory>
- Рестартим Apache2 -
service apache2 restart
В далекие времена все изменения на сайтах долго закачивались на сервер по FTP и это было жутко медленно. Потом люди стали заливать на сервера изменения уже в виде архивов которые стало возможным разворачивать из панели управления хостингом либо же зайдя по ssh.
Сейчас же очень удобно разрабатывать веб-приложения на локальной машине и деплоить их на удаленный сервер одной простой командой - git push.
Чуть ниже пошаговая инструкция по настройке сервера для автоматического деплоя по срабатыванию хука post-receive. Означения: ЛМ - локальная машина и УС - удаленный сервер.
Тут все тоже распишу по шагам:
На локальной машине (ЛМ) инициализируем репозиторий - git init
На сервере (УС) создаем bare-репозиторий - git --bare init
(ЛМ) добавляем адрес удаленного репозитория - git remote add production user@ip:/dir/git/reponame/
(ЛМ) Делаем изменения в проекте и коммитим их - git add -A
и git commit -m "commit comment"
(ЛМ) Создаем новую ветку под названием production - git checkout -b production
Вдальнейшем на сервере будут деплоиться изменения только из этой ветки. В ней мы не работаем! Туда только мержим из других веток тогда когда все готово!
(ЛМ) Сливаем изменения в ветку production и отправляем изменения на сервер - git push -u production
(УС) На сервере переходим в директорию с сайтом - cd ~/website/
Именно туда мы будем деплоить изменения из продакшн-ветки
(УС) Клонируем репозиторий указав конкретную ветку - git clone -b production /dir/git/reponame
(УС) Создаем хук в bare-репозитории - vim /dir/git/reponame/hooks/post-receive
Содержание:
#!/bin/sh
git --git-dir ~/website/.git --work-tree ~/website/ pull
(УС) Делаем файл исполняемым - chmod +x /dir/git/reponame/hooks/post-receive
(ЛМ) Пробуем делать изменения в файлах и пушим их на сервер - git push production production
Наблюдаем нет ли в выводе команды строчек с fatal error. Если нету то все ок.
- (УС) Проверяем - в ~/website/ должны отразиться свежие изменения
Если их нет то пробуем запустить хук вручную - /dir/git/reponame/hooks/post-receive
Вот и все. Ничего сложного =)
Для этого нужно последовательно применить 2 команды:
git fetch --all
git reset --hard origin/master
Более подробно включая еще несколько вариантов: http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull
Вот так можно посмотреть список измененных файлов с времени последнего коммита:
git diff --name-only <индентификтор-коммита>
Сами же идентификаторы можно увидеть в логе
git log