User Tools

Site Tools


geda:scm.ru

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
geda:scm.ru [2012/02/02 07:47]
vzh Rewording, spelling
geda:scm.ru [2014/04/24 16:02] (current)
vzh
Line 1: Line 1:
 +//Эта страница доступна также на следующих языках://​ [[scm|English]]
 +
 +====== gEDA/gaf и git ======
 +
 +В gEDA для управления исходными текстами программ используется **git**.
 +**git** --- это распределённая система управления версиями,​ которая
 +позволяет каждому пользователю иметь свою собственную полную копию истории
 +изменений проекта.
 +
 +  * [[http://​git.or.cz/​|Официальная веб-страница git]]
 +  * [[http://​www.kernel.org/​pub/​software/​scm/​git/​docs/​|Интерактивная документация по git]]
 +  * [[wp>​Git_(software)|Страница википедии по git]]
 +
 +===== Установка git и других вспомогательных программ =====
 +
 +Конечно,​ в первую очередь для использования репозитория необходимы основные
 +инструменты **git**, и всегда полезна документация. Но часто для работы с
 +**git** удобно пользоваться и другими средствами:​
 +
 +  * [[http://​www.kernel.org/​pub/​software/​scm/​git/​docs/​gitk.html|gitk]],​ программа просмотра истории репозитория
 +  * [[http://​www.procode.org/​stgit/​|Stacked Git]], для работы с наборами заплат
 +
 +
 +Для дистрибутивов на основе Debian:
 +
 +  apt-get install git-core git-doc gitk stgit
 +
 +Ещё может пригодиться следующее:​
 +
 +  apt-get install git-email git-completion
 +
 +
 +Fedora Linux:
 +
 +  yum install git stgit
 +
 +
 +
 +
 +===== Изучение git =====
 +
 +Главная страница документации **git**:
 +
 +  * [[http://​www.kernel.org/​pub/​software/​scm/​git/​docs/​|Официальная документация git]]
 +
 +Руководство пользователя **git**:
 +
 +  * [[http://​www.kernel.org/​pub/​software/​scm/​git/​docs/​user-manual.html|Руководство пользователя git]]
 +
 +Текущее руководство можно найти по ссылке:​
 +
 +  * [[http://​www.kernel.org/​pub/​software/​scm/​git/​docs/​gitcore-tutorial.html|Введение в основы git]]
 +
 +Другие замечательные руководства/​веб-страницы:​
 +
 +  * [[http://​wiki.sourcemage.org/​Git_Guide|Руководство по Git]]
 +  * [[http://​git.or.cz/​course/​index.html|Аварийные курсы по git]]
 +
 +Имейте в виду, что некоторые из этих руководств немного устарели и могут не
 +совсем полно отражать текущий синтаксис **git**.
 +
 +
 +
 +
 +
 +
 +
 +
 +===== Анонимный доступ к репозиторию =====
 +
 +Клонирование (создание точной локальной копии) репозитория **geda-gaf.git**
 +(или любого другого репозитория,​ поддерживаемого на
 +[[http://​git.geda-project.org|git.geda-project.org]]) с использованием
 +анонимного доступа **git** производится так:
 +
 +  git clone git://​git.geda-project.org/​geda-gaf.git
 +
 +или
 +
 +  git clone git://​git.geda-project.org/​pcb.git
 +
 +Для клонирования других репозиториев,​ поддерживаемых на
 +''​git.geda-project.org'',​ достаточно поправить последнюю часть вышеуказанной
 +ссылки.
 +
 +Для репозиториев различных проектов существует
 +[[http://​hjemli.net/​git/​cgit/​about/​|cgit]]-интерфейс. Открыть его можно,
 +просто набрав в строке адреса браузера [[http://​git.geda-project.org/​]].
 +===== Доступ к репозиторию с правами на запись =====
 +
 +Для доступа в **git** с правами разработчика вам нужно связаться с //DJ
 +Delorie//, чтобы он установил ваш открытый ключ SSH на сервере,​ после этого
 +для отправки своих изменений можно использовать следующие адреса:​
 +
 +  ssh://​git@git.geda-project.org/​geda-gaf.git
 +или
 +  ssh://​git@git.geda-project.org/​pcb.git
 +
 +Вам также будет нужно отредактировать у себя файл //''​~/​.ssh/​config''//​
 +(создать,​ если он ещё не существует) и вставить туда следующий текст:
 +
 +  Host git.geda-project.org
 +  Port 65
 +
 +Примечание:​ если у вас проблемы с отправкой изменений в основной репозиторий
 +проекта,​ убедитесь,​ что у вас используется **git** версии 1.5 или выше.
 +
 +Если для доступа к **git** вы отдали администратору ключ, специально
 +созданный для gEDA, вам может быть также нужно добавить к своим настройкам
 +ещё одну строку,​ где указать этот дополнительный ключ:
 +
 +  Host git.geda-project.org
 +  Port 65
 +  IdentityFile ~/​.ssh/​gedaproject_dsa
 +
 +Учтите,​ что файл, на который вы ссылаетесь здесь, это ваш закрытый ключ
 +(«private key»), а файл, который нужно послать на сервер,​ это
 +соответствующий ему открытый ключ («public key»).
 +
 +
 +===== Создание и внесение изменений =====
 +
 +
 +==== Настройка информации о пользователе ====
 +
 +Сначала вам нужно обеспечить,​ чтобы в файле настроек **git** у вас были
 +заданы ваше имя и ваш адрес электронной почты.
 +
 +  $ git config --global user.name "​Здесь должно быть ваше имя"​
 +  $ git config --global user.email вы@ваш_домен.example.com
 +
 +
 +
 +==== Внесение заплат других участников проекта ====
 +
 +При наложении чужой заплаты (например,​ из записи о заплате в ''​launchpad''​),​
 +следует иметь в виду некоторые моменты. Для вносимых изменений **git**
 +сохраняет по два имени и по два адреса электронной почты: «автора» заплаты
 +(«author») и «вносящего» заплату («committer»),​ и при внесении изменений эти
 +данные должны быть правильными.
 +
 +Прежде всего, убедитесь,​ что:
 +  * ваша версия заплаты --- последняя;​
 +  * автор заплаты будет рад, что его заплату внесут в репозиторий (и всё ещё не работает над ней);
 +  * вы довольны заплатой и возьмёте на себя ответственность за вносимые изменения.
 +
 +Для простоты начать можно с неизменённого дерева самой последней версии
 +(**''​git status''​** не должен показывать никаких изменений).
 +
 +Заплата накладывается обычным способом (как этом в примере):​
 +
 +  $ patch -p1 < example_changes.patch
 +
 +Можно также использовать команду **''​git apply''​**:​
 +
 +  $ git apply example_changes.patch
 +
 +Если перед внесением в репозиторий заплату нужно чуть подкорректировать
 +(например,​ поправить пробелы),​ проинформируйте об этом автора. Может быть на
 +основе этой заплаты он делает что-то другое,​ и тогда он должен знать, какие
 +изменения появились в наложенной версии.
 +
 +Примечание:​ //​очень легко допустить случайную ошибку,​ если ваш редактор
 +заменяет пробелы знаками табуляции. Не разрешайте ему этого!//​
 +
 +Прежде чем вносить изменения,​ **git** нужно проинформировать о всех
 +изменённых,​ добавленных или, наоборот,​ удалённых файлах. Чтобы посмотреть,​
 +какие файлы изменены,​ можно запустить:​
 +
 +  $ git status
 +
 +Для скорости,​ командой
 +
 +  $ git add -u
 +
 +можно обновить все файлы, отслеживаемые **git**, включая удалённые.
 +
 +Добавление новых файлов,​ вводимых в репозиторий с этой заплатой,​
 +производится командой
 +
 +  $ git add new_file.c
 +
 +Примечание:​ параметры **''​git add''​** могут также задаваться и с помощью
 +метасимволов.
 +
 +При внесении заплаты обязательно следует указать имя и адрес электронной
 +почты автора:​
 +
 +  $ git commit --author "​Здесь должно быть имя автора <​author@example.com>"​
 +
 +Как вариант,​ если заранее настроить переменные окружения ''​GIT_AUTHOR_NAME''​
 +и ''​GIT_AUTHOR_EMAIL'',​ команду **''​git commit''​** можно запускать как
 +обычно.
 +
 +
 +==== Написание хороших сообщений о вносимых изменениях ====
 +
 +
 +Формат сообщения о вносимых изменениях ["​commit message"​] следующий:​
 +**строго** однострочное изложение сути заплаты,​ за которым следует пустая
 +строка,​ а затем длинное описание. Если можно уместить полное описание
 +заплаты в одной строке,​ --- прекрасно,​ --- тогда и не стоит забивать голову
 +насчёт длинного описания.
 +
 +Однострочные описания используются для создания темы электронного письма и
 +для отображения в журналах **gitk** и **gitweb**. Очень удобно,​ когда они
 +написаны хорошо,​ потому что это значит,​ что пользователь этих программ
 +сможет быстро находить интересные изменения.
 +
 +**Не добавляйте** в сообщения о вносимых изменениях перечни изменённых файлов. ​ Эту информацию очень просто извлечь с помощью инструментария **git**.
 +
 +Пример:​
 +
 +<​code>​
 +Added new GedaList class derived from GObject
 +
 +This abstracts a GList with API for write access. Its main use is in list
 +change notification,​ as it emits a "​changed"​ g_signal when modified. ​ Read
 +only access to the underlying GList is provided by an accessor, currenly
 +implemented as a macro. ​ </​code>​
 +
 +==== Операция push - разрушительна ====
 +
 +**Предупреждение:​ добавление изменений с помощью //push// в удалённый репозиторий разрушительно**
 +
 +В отличие от CVS, командой **''​git-push''​** изменения не просто добавляются
 +в основной репозиторий,​ но «продвигается» локальная версия. Всегда нужно
 +дважды (или даже трижды) проверить,​ что «продвигаемые» вами изменения в
 +самом деле предназначены для основного репозитория.
 +
 +
 +
 +===== Как мне ... ? =====
 +
 +Более подробную информацию можно найти в
 +[[http://​wiki.sourcemage.org/​Git_Guide|Руководстве по Git]].
 +
 +==== ... получить копию репозитория git проекта gEDA/gaf? ====
 +
 +При анонимном доступе только на чтение:​
 +
 +  $ git clone git://​git.geda-project.org/​geda-gaf
 +
 +Для разработчиков с доступом на чтение и запись:​
 +
 +  $ git clone ssh://​git@git.geda-project.org/​geda-gaf
 +
 +==== ... поддерживать соответствие своей локальной копии текущей версии?​ ====
 +
 +Те, кто не собирается отправлять свои изменения в центральный репозиторий
 +**git**, могут запустить:​
 +
 +  $ git pull
 +
 +Однако тем из вас, кто собирается «продвигать» свои изменения в центральный
 +репозиторий **git**, использование **''​git pull''​** испортит историю
 +сообщениями об объединении веток («Merge branch '​master'​»). Чтобы избежать
 +этого, нужно запустить:​
 +
 +  $ git fetch
 +  $ git rebase origin
 +
 +==== ... внести свои изменения в локальный репозиторий git? ====
 +
 +  $ git commit -a
 +
 +Эта команда найдёт все изменённые файлы, о которых знает **git**
 +(добавленные с помощью **''​git-add''​**) и запросит у вас сообщение о
 +вносимых изменениях. ​ Непременно следуйте указанному выше соглашению по
 +написанию таких сообщений,​ если планируете отправлять свои изменения в
 +центральный репозиторий.
 +
 +Если вы хотите внести файлы из текущего каталога,​ или хотите внести только
 +явно определённые файлы, не указывайте флаг ''​-a''​ и (или) укажите имена
 +выбранных файлов в командной строке,​ например:​
 +
 +  $ git commit filename1 filename2
 +
 +
 +
 +==== ... отменить все локальные изменения,​ ещё не внесённые в репозиторий?​ ====
 +
 +  $ git checkout -f
 +
 +Учтите,​ что при этом все изменения в любых файлах,​ отслеживаемых в
 +**git**-репозитории,​ будут отвергнуты.
 +
 +Если нужно отменить изменения только в одном файле, достаточно запустить:​
 +
 +  $ git checkout путь/​к/​нужному/​файлу
 +
 +Если нужно отменить все изменения в текущем каталоге и рекурсивно во всех
 +его подкаталогах,​ достаточно запустить:​
 +
 +  $ git checkout .
 +
 +
 +==== ... исправить/​отредактировать изменения,​ внесённые последний раз? ====
 +
 +  $ ... изменение каких-то файлов ...
 +  $ git commit --amend filename1..filenameN
 +
 +Этой командой все новые изменения объединяются с внесёнными в последний раз
 +и заново вносятся в репозиторий со старым сообщением.
 +
 +==== ... отслеживать ветку? ====
 +
 +  $ git checkout --track -b <​локальная_ветка>​ origin/<​удалённая_ветка>​
 +
 +Этой командой создаётся ветка //<​локальная_ветка>//,​ в которой отслеживается
 +удалённая ветка //<​удалённая_ветка>//​.
 +
 +==== ... создать ветку (начиная с определённого тега)? ====
 +
 +Нужно запустить следующие команды (для примера используется ветка
 +//​stable-1.4//​):​
 +
 +   $ git branch stable-1.4 1.4.0-20080127
 +   $ git checkout stable-1.4
 +   <​что-то редактируем>​
 +   $ git commit -a
 +
 +Чтобы опубликовать эту ветку в центральном репозитории (требуется доступ в
 +него на запись):​
 +
 +   $ git push origin stable-1.4
 +
 +==== ... получить ветку разработки другого разработчика?​ ====
 +Кроме репозитория [[http://​git.geda-project.org/​]],​ у нас есть его зеркало
 +на [[http://​repo.or.cz/​w/​geda-gaf.git]]. Некоторые разработчики имеют свои
 +ответвления («fork») данного репозитория с ветками («branch») разработки
 +новых возможностей.
 +
 +Если вы хотите попробовать одну из веток с новыми возможностями,​ нужно
 +получить её из репозитория разработчика. Самый лёгкий способ получения ветки
 +--- использовать команду **''​git fetch''​**.
 +
 +    $ git fetch ссылка_на_репозиторий название_удалённой_ветки:​название_локальной_ветки
 +
 +**Примеры:​**
 +Получение ветки //​cairo_experiment//​ от //Peter C.// выглядело бы так:
 +
 +    $ git fetch git://​repo.or.cz/​geda-gaf/​pcjc2.git cairo_experiment:​peters_cairo_experiment
 +
 +Теперь вы можете переключиться на локальную копию ветки
 +//​peters_cairo_experiment//​ и поиграться с ней.
 +
 +Более того, в локальный репозиторий можно добавить несколько удалённых ответвлений:​
 +    $ git remote add <​название>​ <url>
 +    $ git fetch <​название>​
 +При условии,​ что <​название>​ уникально,​ у вас появится возможность следить за
 +их развитием,​ не создавая локальных веток. С помощью таких
 +программ,​ как **gitk**, можно следить за прогрессом в ветках разработки различных возможностей в разных ответвлениях:​
 +    $ gitk --all
 +
 +**Примеры:​**
 +    $ git remote add peter-b https://​github.com/​peter-b/​geda-gaf.git
 +    $ git fetch peter-b
 +    $ git remote add gareth8118 https://​github.com/​gareth8118/​geda-gaf.git
 +    $ git fetch gareth8118
 +    $ git remote add bert https://​github.com/​bert/​geda-gaf.git
 +    $ git fetch bert
 +    $ gitk --all
 +
 +Теперь gitk будет забит до отказа,​ но с помощью **//​Файл//​** -> **//​Список
 +ссылок//​** [**//​File//​** -> **//List references//​**] (<​key>​F2</​key>​) можно
 +открыть диалоговое окно для более лёгкой навигации.
 +
 +Обновление любимых веток сократится тогда до:
 +    $ git fetch --all
 +==== ... сделать заплату,​ чтобы отправить её разработчикам?​ ====
 +Самый простой способ,​ в котором в заплату включаются все изменения с тех пор, как локальный репозиторий синхронизировался с репозиторием на geda-project.org:​
 +  $ git diff > имя_файла_заплаты
 +
 +Более сложный способ с бóльшим контролем над содержимым заплаты:​
 +  $ git add -i           # выбрать файлы для внесения изменений
 +  $ git status ​          # проверить,​ что будут внесены именно те изменения,​
 +                         # которые вы намеревались внести
 +  $ git commit ​          # внести изменения
 +  $ git format-patch -1  # сделать файл заплаты,​ основанный на данных изменениях
 +Последняя команда выведет имя файла, содержащего заплату. Чтобы больше узнать об этой команде,​ обязательно взгляните на документацию по **git-format-patch**. Полученный файл можно отправить по электронной почте разработчикам,​ имеющим доступ на запись,​ и они смогут наложить заплату с помощью **''​git apply''​**.
 +
 +==== ... восстановить на самом деле испорченный локальный репозиторий?​ ====
 +
 +Прежде всего, не вздумайте никуда «продвигать» командой **''​git push''​**
 +никаких изменений из локального репозитория,​ если вы думаете,​ что в нём
 +что-то испорчено. Спросите сначала кого-нибудь более опытного в **git**.
 +
 +Во-вторых,​ команда,​ которая в самом деле спасёт вашу шкуру --- это
 +**git-reflog**. Она используется примерно так:
 +
 +   $ git reflog
 +   ​086908e... HEAD@{0}: cherry-pick:​ Last minute updates to the READMEs for all pro
 +   ​2a79a23... HEAD@{1}: checkout: moving to master
 +   ​2a79a23... HEAD@{2}: checkout: moving to master
 +   ...
 +   $ git reset --hard HEAD@{1}
 +
 +Последняя команда (**''​%%git reset --hard ...%%''​**) откатит все ваши
 +изменения к шагу «checkout: moving to master». ​ Помните:​ не паникуйте! С
 +помощью **git** можно многое починить.