UsesGit
Использование Git для разработки в Etersoft
Установка Git и настройки пользователя
Если в вашей системе ещё нет команды git, то установите пакет git (версии 1.5 и выше) штатным для системы образом (apt-get install git).
Для работы с сервером git.etersoft.ru следует добавить в ssh псевдоним для него (файл ~/.ssh/config).
Подробное описание находится на странице http://wiki.office.etersoft.ru/devel/info
Клонирование репозитория
Первый раз нам нужно выполнить клонирование репозитория, с котором будет производится работа. Это длительная операция, в ходе которой репозиторий со всеми ветками и патчами переносится к вам на машину.
Например, для WINE@Etersoft нужно выполнить такую команду:
git clone git.office:/projects/wine/eterhack.git wine-etersoft-public
где wine-etersoft-public - это локальный каталог, где будет создан репозиторий (указывать не обязательно).
Репозиторий следует создавать в каталоге /Projects.
Команда для получения публичного репозитория:
git clone http://git.etersoft.ru/projects/wine/eterwine.git wine-etersoft-public
Подробнее о репозиториях см. на http://winehq.org.ru
Ветки репозитория и их использование
После клонирования репозитория нужно получить ту ветку, с которой вы собираетесь работать:
git checkout -b eterhack origin/eterhack
Это добавит ветку eterhack и переключит в неё.
После этого с помощью команды git branch можно увидеть имеющиеся ветки:
$ git branch eter-1.0.9 * eterhack pure
Назначение веток в eterwine
- pure - ветка с оригинальным Wine, она синхронизируется с оригинальным репозиторием. Не создавайте коммиты в этой ветке, не изменяйте её.
- master - основная ветка нашей разработки (регулярно мержится с pure), туда мы коммитим изменения, которые могут быть у нас приняты в оригинальный Wine.
Назначение веток в eterhack
- eterhack - нестабильная ветка, которая мержится с eterwine/master и которая является нашей текущей веткой для разработки WINE@Etersoft. Сюда помещаются патчи, которые не могут быть приняты в оригинальный Wine (аналог patches/hack), но которые подходят для всех проектов.
- eter-1.0.11 - ветка разработки текущего релиза WINE@Etersoft. В неё попадают изменения, специфичные для конкретного релиза.
Таким образом, eterhack по сравнению с eterwine/master дополнен нашими хаками.
Переключение между ветками
Для переключения между ветками используется команда git-checkout:
$ git checkout master Already on branch "master" [lav@builder wine]$ git-checkout eterhack Switched to branch "eterhack"
Управление репозиториями
Настройка репозитория
Для того, чтобы Ваше имя и адрес почты были корректными, их следует явно задать (Имя Фамилию — на английском):
git config --global user.name "Your full Name" git config --global user.email "login@etersoft.ru"
например,
git config --global user.name "Ivan Ivanov" git config --global user.email "iv@etersoft.ru"
Ключ --global задаёт сохранение данных в файле ~/.gitconfig, применяемый для всех репозиториев. Без --global настройки будут сохранены в текущем репозитории (.git/config).
При отправке в англоязычную рассылку обратите внимание, чтобы профиль в вашем почтовом клиенте был заполнен также на английском, чтобы в рассылке поняли как вас зовут :)
Обновление репозитория
Для удобства работы стоит добавить всех удалённые репозитории, с которыми мы собираемся работать.
Добавить репозиторий можно командой
git remote add название git.eter:/people/sin/packages/wine.git
которой указывается желаемое название репозитория и путь к нему.
Посмотреть имеющиеся репозитории можно командой
git remote -v
Посмотреть ветки удалённого репозитория:
git branch -r
Для получения ветки из удалённого репозитория нужно создать ветку у себя и получить туда изменения, например для eter-1.0.9:
git checkout -b eter-1.0.9 origin/eter-1.0.9 git pull
Любую ветку можно обновить отдельно:
$ git checkout master $ git pull origin master
Синхронизация веток
Синхронизация веток (если внесены изменения в master, которые хотелось бы тут же увидеть в eterhack):
git checkout eterhack git merge master
Перенос отдельного коммита из другой ветки (если в eterhack внесено изменение, которое нужно перенести в master):
git checkout master git cherry-pick COMMIT-ID
Публикация репозитория
Чтобы другие могли получить доступ к вашим изменениям, их нужно опубликовать на git.etersoft.ru.
Перед первой публикацией на удалённом сервере нужно инициализировать репозиторий командой
$ ssh git.eter init-db packages/wine.git
Эта команда создаст пустой репозиторий с указанным названием.
Конечно, для этого потребуется аккаунт на git.etersoft.ru. Пишите на support@etersoft.ru
Далее следует добавить псевдоним для своего удалённого репозитория:
git remote add origin git.eter:packages/wine.git
где origin — сокращённое название репозитория, используется по умолчанию.
Далее для передачи обновлений выполняем каждый раз
$ git push origin
Удаление ветки из удалённого репозитория
$ git push git.eter:packages/wine.git :ненужный_branch
Получение изменений из другого репозитория
Предположим что пользователь sin в репозитории wine.git ведёт ветку hacks, изменения в которой нам хотелось бы получить.
git remote add sin git.eter:/people/sin/packages/wine.git git fetch sin git checkout -b sinhacks sin/hacks git pull
1. добавляем удалённый репозиторий, называя его sin
2. получаем изменения из удалённого репозитория sin
3. создаём новую ветку sinhacks на основе ветки hacks удалённого репозитория sin
Просмотр изменений в другом (удалённом) репозитории
$ git remote show vostok * remote vostok URL: git.eter:/people/vostok/packages/wine.git New remote branches (next fetch will store in remotes/vostok) eter-1.0.9 eterhack master pure $ git diff vostok/master
Внесение изменений
Откат локальных изменений
Для отката изменённого/удалённого файла к тому состоянию, в каком он в репозитории:
git checkout название_файла
Откат всех локальных изменений в репозитории:
git checkout -f
Cкрытие локальных изменений
Часто возникает ситуация, когда необходимо обновиться до последней версии, но при этом не хочется терять локальные изменения.
Для этого существует комманда:
git stash
Она сохраняет все незакоммиченные изменения и сбрасывает текущее положение до HEAD.
После обновления репозитория можно вызвать комманду
git stash apply
она вернёт все прежние изменения
Отмена (последнего) коммита
Исправление последнего коммита.
Исправьте файл. Запустите
git commit --amend файл
Возврат после неудачного коммита (удаляет последний коммит без следов)
git reset --hard HEAD^
Создание отменяющего коммита (создаётся ещё один коммит, отменяющий последнее изменение)
git revert HEAD
Чтобы откатить определённый коммит:
git revert COMMIT
Изменение порядка коммитов
Если последние коммиты имели несколько беспорядочный характер, и вы решили изменить их порядок, изменить,
объединить или удалить, то нужно использовать rebase:
git rebase -i HEAD~5
эта команда продолжит вам поменять последние 5 коммитов.
Откат до определённого коммита
Чтобы вернуть репозиторий в состояние, которое было после определённого коммита, нужно знать ID этого коммита (COMMIT).
git reset --hard COMMIT
При это все последующие коммиты будут уничтожены.
Просмотр изменений
Просмотр локальных изменений (незакоммиченных):
git diff [файл]
Сравнение разных веток:
git diff pure master
Выявление автора строк
В простейшем случае, чтобы узнать коммит и автора, внёсшего строки в файл, достаточно запустить git blame файл.
Для ускорения можно сразу указать диапазон строк. При использовании параметра -C будет указано происхождение строк,
даже если они первоначально были внесены в другой файл.
git blame -L 10,19 -C файл
Внесение(коммит) изменений
Изменения вносятся командой git commit, которая без параметров вносит изменения только тех файлов, для которых был повторно выполнен git-add.
Более привычной будет команда git commit -a, которая создаёт коммит для всех ранее отслеживаемых и изменённых файлов. Обратите внимание, что коммит будет выполнен для всех изменённых файлов в репозитории.
Также можно воспользоваться командой git commit название_файла, которая внесёт изменения в указанных файлах.
Команда git commit вызывает текстовый редактор (обычно vi) для редактирования комментария к коммиту.
Редактор vi не имеет интуитивно-понятный интерфейс, но к нему есть краткая инструкция.
Создание патчей
git format-patch ID
ID - идентификатор предыдущего коммита. Коммиты, более новые, чем указанный, будут записаны в файлы.
Посмотреть сделанные коммиты можно через
git log
Пример, в первой строчке - ID коммита:
commit 53333771aae4888ee2e8373cec0abb06e3d1c290 Author: sergeym <sergeym@etersoft.ru> Date: Sat Mar 17 15:29:26 2012 +0400
Если надо, чтобы в тему письма включался номер патча в серии, можно использовать параметр -n:
git format-patch -n ID
В результате получится нечто вроде
Subject: [PATCH 02/22] hal: Add stub for HalTranslateBusAddress.
Слово патч можно заменить на любое другое с помощью параметра --subject-prefix:
git format-patch -n --subject-prefix=eterhack ID
Получится
Subject: [eterhack 02/22] hal: Add stub for HalTranslateBusAddress.
Сгенерированные патчи можно отправить по почте с помощью команды
git send-email --from 'Your Name <yourname@etersoft.ru>' --to 'wine-patches@lists.etersoft.ru' 0*.txt
Регрессивное тестирование
Использование git bisect
Git bisect позволяет методом бинарного поиска определять коммит, создающий ошибку
Допустим есть 2 версии исходников: версия в которой ошибка отсутствует и версия с ошибкой. После запуска git bisect делает несколько шагов, каждый раз спрашивая присутствует ли ошибка в текущей версии. В итоге за минимальное число шагов удаётся найти коммит, создающий ошибку.
Инициализация поиска
git bisect start
Сообщаем, что в версии wine-1.0 ошибки нет
git bisect good wine-1.0
Сообщаем, что в версии wine-1.1.1 ошибка присутствует
git bisect bad wine-1.1.1
Далее bisect находит середину, и шагает в это место. Требуется перекомпилировать исходники (configure && make) и запустить тест.
Сообщаем, что ошибка всё ещё есть (или good если её уже нет)
git bisect bad
Для большей наглядности можно использовать графическое представление дерева
git bisect visualize
Для возврата к исходному состоянию
git bisect reset
Особенности использования git bisect в ветке eterhack
При использовании git bisect в ветке eterhack возникает следующая проблема: между мержами находятся патчи из ветки pure. Git bisect перескакивая на них оказывается в ветке pure и игнорирует патчи из eterhack.
Для решения этой проблемы патчи из pure и eterhack должны быть в одной ветке. Для этого нужно:
1) Сделать временную рабочую ветку (чтобы не портить текущий репозиторий) - cкопировать ветку pure. Для этого находясь в pure надо выполнить
git checkout -b tmp
2) смержить eterhack во временную ветку:
git merge eterhack
После этого коммиты из ветки pure и eterhack окажутся в одной ветке, и можно будет пользоваться git bisect.
Возникает серьёзная проблема, если между коммитом, где бага уже присутствует (bad commit), и коммитом где баги ещё нет(good commit) текущая версия не собирается, а патч исправляющий данную ошибку находится выше bad commit.
Решить её можно следующим способом:
1) Сделать временную рабочую ветку (аналогично предыдущему случаю)
git checkout -b tmp
2) Для экономии времени и нервов, откатиться до bad commit (версии, где бага уже присутствует).
git reset --hard [id of bad commit]
3) Приложить патч, исправляющий ошибку компиляции
4)Опустить его в самый низ, ниже коммита, где ошибки ещё нет. Для этого выполнить
git rebase -i [id of good commit]
и в текстовом редакторе поднять соответствующий коммит наверх (там порядок следования коммитов обратный).
После этого начнётся rebase дерева. По ходу процесса могут возникать конфликты. Думаю бесполезно их все исправлять, можно их пропускать:
git rebase --skip
Остаётся надеятся что конфликты ни на что не повлияют.
Далее остаётся только:
5) смержить eterhack во временную ветку:
git merge eterhack
и можно применять git bisect
Другой вариант, который мы пробовали: начиная с места, про которое известно, что там программа работала, сделать git format-patch.
Полученные патчи применить в новой ветке, начатой от место, где всё работало (через git am). Получаем чистую ветку, в которой можно делать проверку.
Конвертирование из CVS
Если репозиторий (описание коммитов) не в UTF-8, нужно установить кодировку:
$ git config --global i18n.commitencoding koi8-r
И выполнить
$ git cvsimport -p x -v -d :ext:cvs.etersoft:/var/local/cvsroot РЕПОЗИТОРИЙ
в созданном для нового репозитория каталоге
Если в дальнейшем вы планируете делать описания в кодировке UTF-8, отмените задание кодировки:
$ git config --global --unset i18n.commitencoding
Для того, чтобы корректно сконвертировать авторов коммитов, нужно добавить файл трансляции авторов при импорте ключом -A файл_с_авторами,
в котором каждая строка имеет формат:
[имя в CVS] = [полное имя] <[адрес email]>
.
Например,
vitlav = Vitaly Lipatov <lav@etersoft.ru> phantom = Phantom Ghostly <ph.gh@mail.net>
Работа в Git при том, что майнстрим в SVN
1. cd strigi && git svn init https://svn.kde.org/home/kde/trunk/kdesupport/strigi
2. запускаем git svn fetch [ -rREVISION ] для скачивания исходного дерева
3. git svn rebase для внесения изменений из svn в рабочую ветку
Псевдонимы для удалённых репозиториев
Для удобства работы можно создать псевдоним для репозитория:
git remote add eter git.eter:/people/lav/packages/wine.git
Посмотреть имеющиеся всевдонимы:
$ git remote -v eter git.eter:packages/wine.git
Тонкости создания веток
Создание ветки на основе тега wine-0.9.59:
$ git checkout -b eter-1.0.9 wine-0.9.59 Switched to a new branch "eter-1.0.9"
Настройка вывода патчей и статуса
В некоторых системах в git не настроен вывод цветных патчей, например, в Fedora. Для включения этих возможностей используйте команды:
$ git config --global color.diff no $ git config --global color.status auto $ git config --global color.branch auto $ git config --global core.editor vim $ git config --global core.pager "vim -"
Эти команды включают использование цвета в diff, status и branch, устанавливают редактором по умолчанию и просмотрищиком патчей vim. Так как vim сам подсвечивает патчи, то гитовую расцветку надо выключить.
Документация
Другая наша документация по git
ALTLinux at FreeSource
Русскоязычные описания работы с Git
- Проект Про Git
- Волшебство Git
- Интерактивный тур - Git How To
- Как оформлять коммиты
- IBM Developerworks, Часть 1
- IBM Developerworks, Часть 2
- Git для начинающих
- Полезные советы по Git
- Редактирование истории (Максим Чистолинов)
Англоязычные описания работы с Git
- Аналогичная документация по разработке Wine (на англ.)
- Work with Git branches
- HackingTips - Manage Wine Sources with Git
- The Thing About Git
Kernel developers resources