На локальной машине:
Инициализируйте каталог для синхронизации как Git-репозиторий
git init
Зафиксируйте любой существующий код
git add -A
git commit -am "initial commit"
Установите его удаленным к серверу
git remote set-url origin user@server:/path/to/dir/on/server
куда
user
- это имя пользователя, которое вы используете для SSH на вашем server
. Например. root@10.10.10.10
/path/to/dir/on/server
- это каталог на сервере, с которым вы хотите синхронизировать свои изменения
Примечание: желательно использовать пароль без логина для входа по SSH.
На удаленной машине:
Инициализировать пустой каталог на сервере
mkdir /path/to/dir/on/server
cd /path/to/dir/on/server
git init
Настройте его конфигурацию так, чтобы игнорировать обновления для извлеченной ветки
git config receive.denyCurrentBranch ignore
Это необходимо, потому что (цитируя точную ошибку, которую вы получите, если вы этого не сделаете) « обновление текущей ветки в не-пустом хранилище запрещено, потому что это сделает индекс и дерево работы несовместимыми с тем, что вы нажали, и потребует 'git reset --hard' для сопоставления рабочего дерева с HEAD. "(на самом деле мы сделаем это на следующем шаге).
Установите post-receive
git hook:
Создайте файл post-receive
в каталоге .git/hooks
и откройте его в редакторе:
vim .git/hooks/post-receive
Поместите следующее:
#!/bin/sh
git --git-dir=. --work-tree=.. checkout -f
Установите его режим на исполняемый файл:
chmod +x .git/hooks/post-receive
Это будет проверять ваши последние изменения в каталоге сервера всякий раз, когда вы нажимаете любой.
Один вкладыш для всего вышеперечисленного:
dir=<dir>; mkdir $dir && cd $dir && git init && git config receive.denyCurrentBranch ignore && printf '#!/bin/sh\ngit --git-dir=. --work-tree=.. checkout -f' > .git/hooks/post-receive && chmod +x .git/hooks/post-receive
Теперь на локальной машине вы можете сделать это:
git commit -am "Some changes"
git push
и ваш локальный каталог будет синхронизирован с сервером.
Дополнительный рецепт , который я часто использую: На локальной машине, я держу origin
имя удаленного для Github/Bitbucket , который является "домом" проекта, а также специальный server
удаленного имя , которое где развертываются. Я также создаю server
git branch (который также называется) и настраиваю его на постоянную передачу на удаленный server
:
git config branch.server.remote server
git config remote.server.push server:master
Таким образом, всякий раз, когда я нахожусь в основной ветке, он перемещается к origin
(Github/Bitbucket и т.д.), А когда я нахожусь в ветке server
он толкает к серверу.