Как просто создать удаленный GIT репозитарий на домашнем сервере

в 9:35, , рубрики: Git, lifehack, метки:

Удобно иметь доступ к своему коду с разных компьютеров. Поэтому некоторые свои проекты я кладу на github. Но есть и такие, которые выкладывать в публичный доступ я не хочу (стыдно за код, либо имеют коммерческий потенциал), а покупать тариф с приватными репо и жаба душит и хлопотно.

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

Мои камиты в локальный репо на винде или на убунте автоматом переносятся в основной репозитарий. Просто чтобы не держать в голове лишней рутины. Домашний основной репозитарий должен всегда содержать самую свежую версию проекта.

Взгляд сверху

Имеем несколько (>=2) компьютеров в домашней сети. Выбираем один из них и называем его сервер, остальные назовем клиентами. На сервере должен быть linux, а не windows — так проще. На каждом из них мы будем иметь доступ к основному репозитарию и сможем делать в локальном репозитарии вот так:

git pull origin master
git push origin master

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

Что понадобится

Необходим доступ с каждого компьютера на сервер по ssh для пользователя git. Как он настраивается написано много статей.

Таким образом, если ваш сервер называется fobos, и вы настроили ssh доступ для пользователя git на компьютере-клиенте, то вы должны соединяться с него с сервером такой командой: ssh git@fobos. Если вы планируете иметь локальный репозитарий и на сервере, то эта команда должна выполняться без ошибок и на сервере.

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

Также на каждом компьютере клиенте и на сервере должен быть установлен git.
На винде у меня стоит git version 1.7.7.msysgit.1, OpenSSH_4.6p1,OpenSSL 0.9.8e23 Feb 2007.
А на убунте стоит git version 1.7.0.4

Создание bare репозитария

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

Выберем какой-нибудь из существующих (или только что созданный) проект с git репозитарием, допустим папка проекта многозначительно называется project19. Мы создаем каталог project19.git на сервере в домашней папке пользователя git от его имени. Имя папки оканчивается на .git потому что такова конвенция именования bare репозитариев. Из его имени сразу видно, что это не рабочий, а bare репозитарий.
adduser git
sudo su git
cd ~
mkdir project19.git
cd project19.git
git init --bare
exit

Репозитарий создан, переходим к компьютеру-клиенту.

Настройка локального репозитария

Перейдем в папку проекта project19 и выполним команду:
git remote add origin ssh://git@fobos/~/progect19.git

Эта команда добавит в конфиг репозитария ссылку на удаленный репозитарий под алиасом origin. Таким образом, origin теперь указывает на наш bare репозитарий. Теперь должны работать push и pull:
git push origin master
git pull origin master

Клонирование репозитария на другой компьютер

Предположим, что на сервере нет локального репозитария. Есть только bare, но его нельзя использовать для работы.
Чтобы его создать переходим в папку где у вас находятся папки проектов и создаем папку project19, заходим в нее.
Выполняем команду: git clone ssh://git@fobos/~/progect19.git

Это выполняется абсолютно одинаково как на локальном компьютере, так и на сервере. Вот в чем удобство ssh.

Автоматический push из локального в основной репозитарий

Чтобы каждый раз при выполнении камита в локальном репозитарии автоматически выполнялся push в основной репозитарий, нужно настроить хук.

Для этого переходим в папку проекта project19 на компьютере-клиенте и заходим в подпапку .git/hooks, создаем файл post-commit с таким содержимым.
#!/bin/sh
git push origin master

Если компьютер-клиент под linux, делаем файл исполняемым chmod +x post-commit

Итого

12 команд. Иключая из них exit, pull/push/clone, которые к настройке не относятся, получаем удаленный репозитарий за 8 команд консоли. Но это без учета настройки ssh доступа по ключу для пользователя git.

Автор: Zloy1


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js