
- •Введение
- •Об управлении версиями
- •Локальные системы управления версиями
- •Централизованные системы управления версиями
- •Распределённые системы контроля версий
- •Краткая история Git
- •Основы Git
- •Слепки вместо патчей
- •Почти все операции — локальные
- •Git следит за целостностью данных
- •Чаще всего данные в Git только добавляются
- •Три состояния
- •Установка Git
- •Установка из исходников
- •Установка в Linux
- •Установка на Mac
- •Установка в Windows
- •Первоначальная настройка Git
- •Имя пользователя
- •Выбор редактора
- •Утилита сравнения
- •Проверка настроек
- •Как получить помощь?
- •Итоги
- •Основы Git
- •Создание репозитория Git
- •Создание репозитория в существующем каталоге
- •Клонирование существующего репозитория
- •Запись изменений в репозиторий
- •Определение состояния файлов
- •Отслеживание новых файлов
- •Индексация измененных файлов
- •Игнорирование файлов
- •Просмотр индексированных и неиндексированных изменений
- •Фиксация изменений
- •Игнорирование индексации
- •Удаление файлов
- •Перемещение файлов
- •Просмотр истории коммитов
- •Ограничение вывода команды log
- •Использование графического интерфейса для визуализации истории
- •Отмена изменений
- •Изменение последнего коммита
- •Отмена индексации файла
- •Отмена изменений файла
- •Работа с удалёнными репозиторями
- •Отображение удалённых репозиториев
- •Добавление удалённых репозиториев
- •Fetch и Pull
- •Push
- •Инспекция удалённого репозитория
- •Удаление и переименование удалённых репозиториев
- •Работа с метками
- •Просмотр меток
- •Создание меток
- •Аннотированные метки
- •Подписанные метки
- •Легковесные метки
- •Верификация меток
- •Выставление меток позже
- •Обмен метками
- •Полезные советы
- •Автоматическое дополнение
- •Псевдонимы в Git
- •Итоги
- •Ветвление в Git
- •Что такое ветка?
- •Основы ветвления и слияния
- •Основы ветвления
- •Основы слияния
- •Основы конфликтов при слиянии
- •Управление ветками
- •Приемы работы с ветками
- •Долгоживущие ветки
- •Тематические ветки
- •Удалённые ветки
- •Отправка изменений
- •Отслеживание веток
- •Удаление веток на удалённом сервере
- •Перемещение
- •Основы перемещения
- •Более интересные перемещения
- •Возможные риски перемещения
- •Итоги
- •Git на сервере
- •Протоколы
- •Локальный протокол
- •Преимущества
- •Недостатки
- •Протокол SSH
- •Достоинства
- •Недостатки
- •Git-протокол
- •Достоинства
- •Недостатки
- •Протокол HTTP/S
- •Достоинства
- •Недостатки
- •Установка Git на сервер
- •Размещение «голого» репозитория на сервере
- •Малые установки
- •SSH доступ
- •Создание открытого SSH-ключа
- •Настраиваем сервер
- •Открытый доступ
- •GitWeb
- •Gitosis
- •Gitolite
- •Установка
- •Изменение параметров установки
- •Конфигурационный файл и правила контроля доступа
- •Продвинутый контроль доступа с запрещающими правилами
- •Ограничение push-ей на основе изменённых файлов
- •Персональные ветки
- •«Шаблонные» репозитории
- •Другие функции
- •Git-демон
- •Git-хостинг
- •GitHub
- •Настройка учётной записи
- •Создание нового репозитория
- •Импорт из Subversion
- •Добавление участников
- •Ваш проект
- •Ответвления проектов
- •Заключение о GitHub
- •Итоги
- •Распределённый Git
- •Распределённые рабочие процессы
- •Централизованный рабочий процесс
- •Рабочий процесс с менеджером по интеграции
- •Рабочий процесс с диктатором и его помощниками
- •Содействие проекту
- •Рекомендации по созданию коммитов
- •Отдельная маленькая команда
- •Отдельная команда с менеджером
- •Небольшой открытый проект
- •Большой открытый проект
- •Итоги
- •Сопровождение проекта
- •Работа с тематическими ветками
- •Применение патчей, отправленных по почте
- •Применение патчей с помощью команды apply
- •Применение патчей с помощью команды am
- •Проверка удалённых веток
- •Определение вносимых изменений
- •Интегрирование чужих наработок
- •Процессы слияния
- •Рабочие процессы с крупными слияниями
- •Рабочие процессы с перемещениями и отбором лучшего
- •Отметка релизов
- •Генерация номера сборки
- •Подготовка релиза
- •Команда shortlog
- •Итоги
- •Инструменты Git
- •Выбор ревизии
- •Одиночные ревизии
- •Сокращенный SHA
- •Небольшое замечание о SHA-1
- •Ссылки на ветки
- •RefLog-сокращения
- •Ссылки на предков
- •Диапазон коммитов
- •Две точки
- •Множество вершин
- •Три точки
- •Интерактивное индексирование
- •Добавление и удаление файлов из индекса
- •Индексирование по частям
- •Прятанье
- •Прятанье своих трудов
- •Откат применения спрятанных изменений
- •Создание ветки из спрятанных изменений
- •Перезапись истории
- •Изменение последнего коммита
- •Изменение сообщений нескольких коммитов
- •Переупорядочение коммитов
- •Уплотнение коммитов
- •Разбиение коммита
- •Крайнее средство: filter-branch
- •Удаление файла изо всех коммитов
- •Сделать подкаталог новым корнем
- •Отладка с помощью Git
- •Аннотация файла
- •Бинарный поиск
- •Подмодули
- •Начало использования подмодулей
- •Клонирование проекта с подмодулями
- •Суперпроекты
- •Проблемы с подмодулями
- •Слияние поддеревьев
- •Итоги
- •Настройка Git
- •Конфигурирование Git
- •Основные настройки клиента
- •core.editor
- •commit.template
- •core.pager
- •user.signingkey
- •core.excludesfile
- •help.autocorrect
- •Цвета в Git
- •color.ui
- •color.*
- •Внешние утилиты merge и diff
- •Форматирование и пробельные символы
- •core.autocrlf
- •core.whitespace
- •Настройка сервера
- •receive.fsckObjects
- •receive.denyNonFastForwards
- •receive.denyDeletes
- •Git-атрибуты
- •Бинарные файлы
- •Определение бинарных файлов
- •Получение дельты для бинарных файлов
- •Документы MS Word
- •Текстовые файлы в формате OpenDocument
- •Изображения
- •Развёртывание ключа
- •Экспорт репозитория
- •export-ignore
- •export-subst
- •Стратегии слияния
- •Перехватчики в Git
- •Установка перехватчика
- •Перехватчики на стороне клиента
- •Перехватчики для работы с коммитами
- •Другие клиентские перехватчики
- •Перехватчики на стороне сервера
- •update
- •Пример навязывания политики с помощью Git
- •Перехватчик на стороне сервера
- •Установка особого формата сообщений коммитов
- •Настройка системы контроля доступа для пользователей
- •Перехватчики на стороне клиента
- •Итоги
- •Git и Subversion
- •Настройка
- •Приступим к работе
- •Коммит в Subversion
- •Получение новых изменений
- •Проблемы с ветвлением в Git
- •Ветвление в Subversion
- •Создание новой ветки в SVN
- •Переключение активных веток
- •Команды Subversion
- •Просмотр истории в стиле SVN
- •SVN-Аннотации
- •Игнорирование того, что игнорирует Subversion
- •Заключение по Git-Svn
- •Миграция на Git
- •Импортирование
- •Subversion
- •Perforce
- •Собственная утилита для импорта
- •Итоги
- •Git изнутри
- •Сантехника и фарфор
- •Объекты в Git
- •Объекты-деревья
- •Объекты-коммиты
- •Хранение объектов
- •Ссылки в Git
- •HEAD
- •Метки
- •Ссылки на удалённые ветки
- •Pack-файлы
- •Спецификации ссылок
- •Спецификации ссылок для команды push
- •Удаление ссылок
- •Протоколы передачи
- •Тупой протокол
- •Умный протокол
- •Загрузка данных
- •Скачивание данных
- •Обслуживание и восстановление данных
- •Обслуживание
- •Восстановление данных
- •Удаление объектов
- •Итоги

Scott Chacon Pro Git |
Раздел 4.9 Git-демон |
«скомпилированный» конфигурационный файл, сделанный gitolite-ом, что означает действие одинаковых правил контроля доступа (для доступа на чтение) и для gitweb, и для gitolite.
Зеркалирование: Gitolite может помочь вам поддерживать несколько зеркал, и легко переключаться между ними, если основной сервер упадёт.
4.9 Git-демон
Для публичного неаутентифицированного доступа на чтение к вашим проектам вы можете захотеть продвинуться дальше, чем протокол HTTP, и начать использовать Git-протокол. Главная причина — скорость. Git-протокол гораздо эффективнее и поэтому быстрее чем HTTP, поэтому,
используя его, вы можете сэкономить вашим пользователям время.
Повторимся, это для доступа только на чтение без аутентификации. Если вы запустите его на сервере не за сетевым экраном, он должен использоваться только для проектов, которые публично видны внешнему миру. Если сервер, на котором вы его запускаете, находится за вашим сетевым экраном, вы можете использовать его для проектов, к которым большое число людей или компьютеров (серверов непрерывной интеграции или сборки) должно иметь доступ только на чтение, и если вы не хотите для каждого из них заводить SSH-ключ.
В любом случае, протокол Git относительно просто настроить. Упрощённо, вам нужно запустить следующую команду в демонизированной форме:
git daemon --reuseaddr --base-path=/opt/git/ /opt/git/
--reuseaddr позволит серверу перезапуститься без ожидания истечения старых подключений,
--base-path позволит людям не указывать полный путь, чтобы склонировать проект, а путь на конце говорит демону Git, где искать экспортируемые репозитории. Если у вас запущен сетевой экран, вы должны проколоть в нём дырочку, открыв порт 9418 на машине, на которой это всё запущено.
Вы можете демонизировать этот процесс несколькими путями, в зависимости от операционной системы. На машине с Ubuntu используйте Upstart-сценарий. Итак, в этом файле
/etc/event.d/local-git-daemon
поместите такой сценарий:
start on startup stop on shutdown
exec /usr/bin/git daemon \ --user=git --group=git \ --reuseaddr \ --base-path=/opt/git/ \ /opt/git/
respawn
101

Глава 4 Git на сервере |
Scott Chacon Pro Git |
По соображениям безопасности крайне приветствуется, если вы будете запускать этого демона как пользователя с правами только на чтение на репозитории — вы легко можете сделать это, создав пользователя ‘git-ro’ и запустив этого демона из-под него. Для простоты мы запустим его от того же пользователя ‘git’, от которого запущен Gitosis.
Когда вы перезапустите машину, Git-демон запустится автоматически, и возродится, если вдруг завершится. Чтобы запустить его без перезагрузки машины, выполните следующее:
initctl start local-git-daemon
На других системах вы можете использовать xinetd, сценарий вашей системы sysvinit,
или что-то другое — главное, чтобы вы могли эту команду как-либо демонизировать и перезапускать в случае завершения.
Затем, вы должны указать Gitosis-серверу, к каким репозиториям предоставить неаутентифицированный доступ через Git-сервер. Если вы добавили по секции для каждого репозитория, вы можете
указать, из каких из них Git-демону позволено читать. Если вы хотите предоставить доступ через Git-протокол к вашему проекту iphone, добавьте это в конец вашего файла gitosis.conf:
[repo iphone_project]
daemon = yes
Когда это зафиксировано и отправлено, ваш запущенный демон должен начать обслуживать запросы к проекту от всех, у кого есть доступ к порту 9418 на вашем сервере.
Если вы решили не использовать Gitosis, но хотите установить Git-демон, вы должны выполнить следующее в каждом проекте, который должен обслуживаться Git-демоном:
$ cd /path/to/project.git
$ touch git-daemon-export-ok
Наличие этого файла скажет Git’у, что можно обслуживать этот проект без аутентификации. Gitosis также может контролировать, какие проекты будет показывать GitWeb. Вам нужно
добавить что-то вроде этого в файл /etc/gitweb.conf:
$projects_list = "/home/git/gitosis/projects.list"; $projectroot = "/home/git/repositories"; $export_ok = "git-daemon-export-ok"; @git_base_url_list = ('git://gitserver');
Вы можете контролировать, какие проекты GitWeb будет позволять просматривать пользователям,
добавляя или удаляя пункт настройки gitweb в конфигурационном файле Gitosis. Например,
если вы хотите, чтобы ваш проект iphone просматривался в GitWeb, сделайте, чтобы секция настроек repo выглядела следующим образом:
102