Распределенный репозиторий GitHub

В этом уроке мы научимся загружать наши git-репозитории в удалённый сервис github.com, чтобы с ними можно было работать с любого компьютера и ими можно было делиться с другим разработчиками.

План урока

  1. Что такое распределённый репозиторий
  2. Создание аккаунта на github.com
  3. Настройка доступа по SSH
  4. Первый публичный репозиторий

Что такое распределённый репозиторий

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

Распределённый репозиторий решает очень много задач:

  1. Надёжность: ваш код всегда хранится на удалённых серверах. Если с вашим компьютером что-то случится, вы просто скачаете код заново.
  2. Удобство: вы можете клонировать ваш код на все ваши компьютеры. На работе, дома. Можете даже смотреть код с планшета или мобильного устройства, если вам это вдруг понадобится.
  3. Распределённость: если над программой работает целая команда программистов, то каждый из них работает со своей версией кода, а потом они могут легко объединить их.
  4. Версионность: любой, кому вы дадите доступ, сможет скачать нужную ему версию вашей программы, если вдруг по какой-то причине его железо или ОС не совместима с последней.
  5. Открытый код (OpenSourse): если вы сделаете ваш проект открытым, другие разработчики смогут смотреть, что вы написали и помогать вам в разработке, если ваша программа окажется для них полезной. Вы также сможете показать исходный код ваших программ потенциальным работодателям.

Как устроен распределённый репозиторий

Распределённый репозиторий — это, фактически, удалённая копия вашей программы, которую вы делаете с помощью git (или другой системы контроля версий) на удалённом сервере, доступном через интернет.

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

Схема работы разработчиков с удалённым репозиторием

Что такое github.com?

Сайтов, предлагающих создавать с их помощью публичные репозитории довольно много. Мы сейчас остановимся на самом популярном из них github.com.

Вот так, например, выглядит страница популярного фреймворка Ruby on Rails на сервисе github.com:

Исходный код фреймворка rails на github.com

Мы неоднократно бывали на похожих страницах других проектов и библиотек в базовом блоке нашего курса.

Создание аккаунта на github-е

Для того, чтобы пользоваться сервисом github необходимо создать там аккаунт. Пока выбирайте бесплатный тариф. Нам он вполне подойдёт. Интерфейс github-а часто меняется, поэтому мы не приводим тут снимков экрана, чтобы вас не запутать.

Главное, на что вам нужно обратить внимание — имя вашего пользователя на github. Оно часто будет использоваться в этом уроке, так что запомните его хорошенько. Во всех командах мы будем писать вместо него .

Для того, чтобы подключить ваш github-аккаунт к нашему локальному репозиторию, необходимо познакомиться с концепцией ssh.

Создание нового репозитория на github

Давайте теперь создадим новый репозиторий в папке урока rubytut2/lesson3 и добавим его в наш github аккаунт. Напишем программу, которая выбирает из колоды 52 карт произвольную.

Начнём с того, что создадим на github-е новый репозиторий. Самое главное для нас, как он будет называться: назовём его pick_a_card.

Обратите внимание, что на бесплатном тарифе вы можете создавать только публичные репозитории. Они видны всем и только такие у нас в курсе и будут. Этого нам вполне достаточно, нам пока скрывать нечего. Приватные репозитории на github-е можно создавать только за деньги. Бесплатно приватные репозитории можно создавать, например, с помощью сервиса bitbucket.org.

git remote via https

Давайте учиться привязывать удалённые репозитории к локальным. Для этого, как мы это делали в первом уроке, создадим локальный репозиторий:

cd rubytut2/lesson3
git init pick_a_card
cd pick_a_card

Откроем проект pick_a_card в RubyMine и создадим файл .gitignore и добавим туда строчку

.idea

После этого напишем нашу программу в файле pick_a_card.rb:

# Массивы с наборами мастей и достоинств
values = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
suits = ['Diamonds', 'Hearts', 'Clubs', 'Spades'] # Буби, Черви, Крести, Пики

# Выведем произвольную карты, выбрав по одному элементу из массивов
puts "#{values.sample} of #{suits.sample}"

Добавим файлы .gitignore и pick_a_card.rb в репозиторий (можно добавлять файлы с помощью git add, указывая их через пробел) и сделаем первый комит:

git add .gitignore pick_a_card.rb
git commit -m "Initial commit"

Пришло время привязать наш удалённый репозиторий к локальному. Это делается с помощью команды git remote. Вам необходимо указать название удалённого репозитория. Обычно, он называется origin и мы именно так и советуем его вам назвать.

git remote add origin https://github.com/<username>/pick_a_card.git

Посмотреть все удалённые репозитории, привязанные к текущему можно с помощью команды

git remote show

Для выполнения операций отправки на свой открытый публичный репозиторий или всех операций с приватным репозиторием необходим ввод логина и пароля. Это неудобно и не всегда безопасно. Оптимальным решением является использование SSH.

Что такое SSH

Вход на любой сервер в наше время закрыт, чтобы кто попало не ходил. Как замок на подъезде. Можно входить кодом (по паролю): так вы заходите в контакт, в одноклассники, в фейсбук и на любые другие сайты. Браузер запоминает ваши данные и повторно их уже не спрашивает.

Некоторые сервера (такие, например, как github), поддерживают авторизацию по SSH. Это как ключ от подъезда: специальный файлик, который играет роль пароля, но зашифрованного, передаваемый каждый раз при входе на сервер.

Авторизация по SSH позволяет ускорить вход на сервер, ведь в современном мире все сервера постоянно общаются между собой. За рабочий день программист может заходить на github сотни раз. Не вводить же ему пароль каждый раз. Для этого используются SSH-ключи.

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

Генерация SSH-ключа

На github-е есть страничка, посвящённая генерации ключа, но мы, на всякий случай, приведём основные шаги здесь.

Откройте консоль git-а (в прошлом уроке мы добавили при установке её иконку на рабочий стол) и выполните команду

ssh-keygen

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

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

ssh-keygen -p

Вуаля! Мы сгенерили ключ. Его публичная часть лежит по адресу C:\users\<username>\.ssh\id_rsa.pub.

Откройте этот файл в любом текстовом редакторе (например, в нашем любимом Sublime) и скопируйте его содержимое.

Найдите на github раздел для добавления ключей и создайте новый ключ: вставьте в поле key то, что вы скопировали в файле id_rsa.pub и нажмите Add Key

Добавляем ssh-ключи на github

Проверить корректность добавления ssh-ключа можно командой

ssh -T git@github.com

Ответ "Hi username! You've successfully authenticated, but GitHub does not provide shell access." говорит о том, что теперь мы подружили github с нашим локальным пользователем через SSH.

git remote via ssh

Привязать репозиторий для работы через ssh можно командой git remote с указанием адреса в соответствующем формате.

git remote add origin git@github.com:<username>/pick_a_card.git

Теперь для работы с репозиторием вводить логин/пароль пользователя не потребуются.

git push

Удалённый репозиторий привязан к локальному, но чтобы в удалённом появились ваши изменения (собственно, написанная нами программа) этого недостаточно. Необходимо сообщить git-у, что мы хотим синхронизировать изменения.

Для синхронизации изменений в git-е есть две команды: git pull и git push.

Перед синхронизацией ещё один нюанс: git синхронизирует ветки (что это такое — читайте в доп. материалах). Мы уже затрагивали понятие ветки master — главной ветки нашего локального репозитория. Удалённый репозиторий ничем не хуже. У него тоже есть свой master.

Именно с ним мы и будем синхронизировать нашу локальную ветку master.

git push -u origin master

Всё, мы, наконец, синхронизировали на код с удалённым репозиторием. Можно зайти на github и посмотреть на наш проект:

Наш первый удалённый репозиторий!

git pull

Теперь давайте прямо на сайте github.com добавим в нашу программу файл README.txt. Для этого в интерфейсе github-а создайте в корне проекта новый файл и напишите там описание нашей программы.

Программа, которая выбирает произвольную карту из колоды 52 карты

Чтобы эти изменения попали в удалённый репозиторий, также необходимо сделать комит. Github сделает его за вас, просто укажите сообщение «Добавили README.txt».

Теперь, чтобы получить этот файл в локальном репозитории, наберите команду

git pull

RubyMine увидит файл README.txt в вашем проекте. Вы также можете убедиться, что комит на месте с помощью команды git log.

Вот с помощью этих двух команд (git pull и git push) и происходит обычно процесс работы с вашим удалённым репозиторием. Вы добавляете какие-то изменения, делаете комит (git commit), потом смотрите, не появилось ли чего нового в удалённом репозитории (git pull), и загружаете ваши комиты на удалённый сервер (git push).

В процессе обучения на нашем курсе в вашем аккаунте не github-е наберётся много прикольных программ: это будет ваше некое портфолио, которые вы потом сможете показать работодателю.

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

Поздравляем! Вы теперь умеете загружать ваши программы на сервис хранения github.com.

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