Перенос файлов сайта с VPS (сервера) на локальный компьютер с помощью Git

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

Если разработка сайта была начата на удаленном сервере, там был инициирован git-репозиторий, то проще всего его загрузить на локальный компьютер с помощью команды git clone. В дальнейшем, при создании коммитов на VPS, их можно "дозагружать" в локальную версию проекта с помощью пулов.

pl@home:~$ git clone ssh://tech@pas1.ru/home/tech/test-with-git
Клонирование в «test-with-git»...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 10 (delta 2), reused 0 (delta 0), pack-reused 0
Получение объектов: 100% (10/10), готово.
Определение изменений: 100% (2/2), готово.
pl@home:~$ cd test-with-git/
pl@home:~/test-with-git$ ls 
file1.txt  file2.txt  file3.txt  file4.txt
pl@home:~/test-with-git$ git status
Текущая ветка: master
Эта ветка соответствует «origin/master».

нечего коммитить, нет изменений в рабочем каталоге
pl@home:~/test-with-git$ git log --oneline
f8ee49a (HEAD -> master, origin/master, origin/HEAD) 4 server
52052bc 3 server
b0c5b96 2 server
d9481d8 1 server
pl@home:~$ git remote -v
origin  ssh://tech@pas1.ru/home/tech/test-with-git (fetch)
origin  ssh://tech@pas1.ru/home/tech/test-with-git (push)

Если же разработка была начата на локальном компьютере, затем было решено ее вести на VPS, то может быть проще перенести туда git-репозиторий копированием (например, с помощью утилиты scp). После этого установить связь между локальным и удаленным репозиторием. Далее уже выполнять обычные пулы.

$ scp -r test-project2 tech@pas1.ru:/home/tech/

Если копируется архив, не забудьте добавить в него скрытые каталоги и файлы. При копировании сайта в каталог /var/www/ скорее всего это надо будет делать через root (root@site.com:/var/www/) и уже на сервере менять владельца каталога сайта.

Устанавливаем связь локального репозитория с только что скопированным удаленным:

pl@home:~$ cd test-project2
pl@home:~/test-project2$ git remote add live ssh://tech@pas1.ru/home/tech/test-project2
pl@home:~/test-project2$ git remote -v
live    ssh://tech@pas1.ru/home/tech/test-project2 (fetch)
live    ssh://tech@pas1.ru/home/tech/test-project2 (push)

Теперь представим, что мы внесли изменения в проекте на сервере и выполнили там коммит:

tech@server:~/test-project2$ vim server-file.txt 
tech@server:~/test-project2$ touch NEW_FILE.html
tech@server:~/test-project2$ git add .
tech@server:~/test-project2$ git commit -m "Отредактирован server-file.txt, создан NEW_FILE.html"
[master 99a99ef] Отредактирован server-file.txt, создан NEW_FILE.html
 2 files changed, 1 insertion(+)
 create mode 100644 NEW_FILE.html

Для загрузки коммитов на локальный компьютер используется команда git pull:

pl@home:~/test-project2$ ls
docs  only_my_notes.txt  program.py  readme.md  server-file.txt  text.txt
pl@home:~/test-project2$ cat server-file.txt 
pl@home:~/test-project2$ git pull live master
Из ssh://pas1.ru/home/tech/test-project2
 * branch            master     -> FETCH_HEAD
Обновление 5b5a1d0..99a99ef
Fast-forward
 NEW_FILE.html   | 0
 server-file.txt | 1 +
 2 files changed, 1 insertion(+)
 create mode 100644 NEW_FILE.html
pl@home:~/test-project2$ ls
docs  NEW_FILE.html  only_my_notes.txt  program.py  readme.md  server-file.txt  text.txt
pl@home:~/test-project2$ cat server-file.txt 
hello
pl@home:~/test-project2$ git log --oneline -2
99a99ef (HEAD -> master, live/master, live/HEAD) Отредактирован server-file.txt, создан NEW_FILE.html
b2792ec тест удаления из индекса