Гит-циклы и работа с хостингом Timeweb

Редакция автор: stain

Git поддержка: GitHub, SourceForge, BitBucket и Google Code.

Начало:

Эта команда создаёт в текущем каталоге новый подкаталог с именем .git содержащий все необходимые файлы репозитория — основу Git-репозитория. На этом этапе ваш проект ещё не находится под версионным контролем.

git init

Git Цикл №1: Индексируем, Подтверждаем, Заливаем.

Индексация - Добавляем новые и измененные данные. Если вы выполнили индексацию, то автоматически согласились с внесением изменений.

git add filename

, или для всех файлов каталога git add .

Делаем новый коммит(снапшот).

git commit -m "комментарий"

Да если добавить параметр -a, то предыдущую команду выполнять не нужно. Дополнительно для проверки состояния репозитария команда git status и более подробная git diff

Или все тоже но в одну строку

git init && git add -A && git commit -m "Initial commit"

Заливка на github.

Предварительно нужно создать на ресурсе github пустой репозиторий.
для справки origin - это название удаленного репозитория, на локальной машине.

git remote add origin git@github.com:loginname/objectname.git
git push -u origin master

Клонируем чужой репозиторий с того же github по ssh.

Создаем или выбираем каталог где будет храниться клон репозитория. В git заходим в выбранную папку.
На github находим нужный нам репозиторий, например jquery, выбираем тип подключения SSH(требуются ключи), забираем ссылку, перед ней вставляем git clone.

git clone git@github.com:jquery/jquery.git

Не Цикл: Заливка на хостинг timeweb.ru.

(утомился ломиться, но ура!).

На хостинге:

через ssh заходим в папку нашего сайта public_html
Инициализация репозитория на сервере, а затем так как мы работаем не с голым (bare) репозиторием, обязательно разрешим перезапись текущей ветки:

git init
git config receive.denyCurrentBranch ignore

естественно нужно все это делать в public_html или на уровень ниже, но надо понимать что распаковка изменений будет аналогично локальному репозитарию.
Хук который делает всю работу

touch .git/hooks/post-receive
cat << EOF > .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
EOF
chmod +x .git/hooks/post-receive

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

git remote add --track master origin ssh://логин@сервер/~/каталогсайта/public_html/.git

Загрузка на целевой сервер основной ветки.

git push --set-upstream origin master

дальше ориентируйтесь на эту статью

Или складываем хуки.

Для выгрузки использовать

git add имяфайла
git commit -m "Ещё один коммит"
git push

Для конкуретного обновления файлов через SSH/FTP нужен еще один хук

touch .git/hooks/pre-receive
cat << EOF > .git/hooks/pre-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git stash save --quiet
git stash show || true
EOF
chmod +x .git/hooks/pre-receive

, но и поправить хук для выгрузки через ssh.

touch .git/hooks/post-receive
cat << EOF > .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
git stash pop --quiet || git reset --hard
EOF
chmod +x .git/hooks/post-receive

В этой усложнённой схеме, в случае конфликтов при git push, вам нужно будет вручную сделать git stash pop на сервере и разрешить конфликты.

ЗЫ:

1. Важно, если ниже, ниже .... уровнем существует каталог .git, то git это видит.

2. если у вас не получилось корректно подключиться, можно удалить созданный вами удаленный репозиторий командой:

git remote remove origin

, в данном примере удаленный репозиторий назван origin

Безусловно еще нужно сделать ключи RSA, залить публичные на сервер. а на клиентской машине прописать конфиг, где будет указано для какого ресурса какие ключи.

Git Цикл №2: Создание и переход в новую ветку.

git checkout -b название ветки

Вернуться к ветке master

git checkout master

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

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

git merge названиеветки

После слияния с основной веткой и если задача для которой была создана ветка решена, следует удалить ветку в которой вы решали задачу.

git branch -d название ветки

Также если у вас несколько веток, и допустим нужно дополнить одну из второстепенных веток изменениями в ветке master, выполните

git merge master

Источник: Основы-ветвления-и-слияния

 

Git Цикл №3: Возврат к более раннему коммиту.

(состоянию, снапшоту).

Просмотр всех существующих коммитов

git log

но добавив параметры -p -2 , мы зададим первым показ изменений, а вторым глубину погружения на 2 ниже.

Теперь само удаление(откат)
Выбираем нужную ветку

git checkout названиеветки

делаем откат изменений в репозитории, для примера на два коммита назад

git reset --hard HEAD~2

Можно сделать до какого то определенного коммита по хешу

git reset --hard HEAD hash

Хеш можно взять в вебинтерфейсе гитхаба.

Далее делаем принудительный коммит в основной репо на удаленном сервере

git push -f origin названиеветки

без -f будет ругаться что у вас версия младше чем на сервере и типа вам надо сделать pull.

Источники: Как откатить коммиты, Git Wizardry.

Забыли произвести индексацию нестрашно, проведите ее после коммита, а затем выполните команду обновления коммита (она также позволяет отредактировать комментарий). Ниже показан весь цикл.

git commit -m 'initial commit'
git add forgotten_file
git commit --amend

Также можно отменить индексацию, если вы еще не провели операцию коммит

git reset HEAD имя файла

какие именно файлы попали в индексацию вы можете узнать с помощью команды git status.

Также можно отменить изменения файла, но нужно понимать что они исчезнут затрутся старым файлом из предыдущего коммита.

git checkout --имяфайла

Как забрать себе репозиторий с Timeweb

Все делается на локальной машине, выбирается папка приемник
в ней открывается консоль GIT

git init
git remote add --track master origin ssh://accountname@IP_server/~/project_folder/public_html/.git
# git fetch - -all #Это лишнее, это для копии текущего состояния без развертывания, чтобы можно было позже сделать слияние.
git pull

# Последующие разработчики, но тут загвоздка пользователь хостинга все же один.
git clone ssh://accountname@IP_server/~/project_folder/public_html/.git
# Проверил работает, но создает каталог public_html, что ломает работу с openserver, но простое перекидывание содержимого на уровень ниже решает проблему.

А если кто то менял файлы ручками на сервере, в истории git это не отобразится, чтобы сделать актуальным состояние в скачиваемых с сервера файлах посредством git, нужно зайти через консоль putty/ssh/или через админку и если полностью то

git add . && git commit -m "commit subject about change"

и уже после этого git pull на клиенте.

P.S.: Естественно у вас должна быть в домашней папке компьютера папка ~/.ssh, с ключем rsa, с конфигом в файле ~/.ssh/config.

Host IP_adress
HostName servername.timeweb.ru
User accountnametimeweb
IdentityFile /C/Users/localusername/.ssh/filenamekey

А на сервере в корне выданной хостером домашней папке, тоже каталог .ssh с публичным ключом вписанным в файл ~/.ssh/authorized_keys

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

!!!После git pull требуется нажать клавишу insert вписать коммент к смерджованному комиту, затем esc, затем :w, что сохранит смерджованые данные, и по сути создаст следующий по счету коммит, после чего можно будет запушить свежий коммит обратно на сервер.

Как поступать с конфликтами при слиянии, и получается что если один файл в разных коммитах имеет разные дополнения, то сливать придется редактированием этого файла до состояния включающего все что вам в нем нужно, и последующей индексацией.
git add . или git add имяфайла
и затем git commit.

Скрипт инициализации git цикла на сервере, исключительно для shared хостинга Timeweb поскольку у него домашние каталоги хостящегося клиента выглядят так /home/u/username.

#!/bin/bash
#bash gitps.sh site user
if [ -z $1 ] ; then
echo «Do not set your domain name.»
exit 1 ; fi
if [ -z $2 ] ; then
username='im'
echo «Do not set your user name. Default name is ${username}» ; fi
if [ ! -d ~/$1/ ]; then
echo '«Site directory noexist! Script stoped.»'
exit 1; fi
if [ -d ~/$1/.git/ ]; then
echo '«Git directory exist, script stoped.»'
exit 1; fi

#git prepare
#subdomain.timeweb.ru
ipsrv='192.168.0.1'
sitename=$1
# $u is first character in username
u=$(echo $username | sed 's/^\(.\).*/\1/')

cd /home/$u/$username/$sitename

git init
git config receive.denyCurrentBranch ignore

touch .git/hooks/post-receive
cat < .git/hooks/post-receive
#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
EOF
chmod +x .git/hooks/post-receive

cd /home/$u/$username

echo ""
echo "«First webdev»"
echo '  «git init»'
echo '  «git add . && git commit -m "commit subject about change"»'
echo "  «git remote add --track master origin ssh://${username}@${ipsrv}/~/${sitename}/.git»"
echo '  «git push»'
echo ''
echo '«Other webdev»'
echo "  «git clone ssh://${username}@${ipsrv}/~/${sitename}/.git»"

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.