Подготовка к миграции из SVN в Git
В разделе Почему именно Git? мы рассмотрели множество преимуществ, благодаря которым Git может помочь команде стать более гибкой. Если вы решились на переход, прежде всего подумайте о том, как перенести в Git существующий процесс разработки.
В этой статье описываются некоторые серьезные изменения, с которыми вы столкнетесь при переводе команды из SVN в Git. В процессе миграции крайне важно помнить о том, что Git — это не SVN. Чтобы реализовать весь потенциал Git, постарайтесь по-новому подойти к управлению версиями.
Для администраторов
С учетом размера команды внедрение Git может занять от пары дней до нескольких месяцев. В этом разделе рассматриваются некоторые основные проблемы, с которыми сталкиваются технические менеджеры при обучении сотрудников работе с Git и при переносе репозиториев из SVN в Git.
Основные команды Git
Раньше систему Git считали сложной для освоения. Однако специалисты по сопровождению Git постоянно выпускают новые улучшения, например разумные умолчания и контекстные справочные сообщения, которые упрощают адаптацию.
Atlassian предлагает полный набор учебных руководств по Git для самостоятельного изучения, а также вебинары и учебные занятия в режиме реального времени. В совокупности они охватывают все варианты обучения, необходимые команде для начала работы с Git. Для начала ознакомьтесь со списком основных команд Git, которые помогут вам приступить к работе:
Связанные материалы
Перемещение полного репозитория Git
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
Задача в Git | Заметки | Команды Git |
---|---|---|
Заметки Указать имя автора и адрес электронной почты, которые будут использоваться в коммитах. Обратите внимание, что Git удаляет из user.name некоторые символы, например точки в конце. | Команды Git git config --global user.name "Sam Smith"git config --global user.email sam@example.com | |
Notes
| Команды Git git init | |
Заметки Создать рабочую копию локального репозитория: | Команды Git git clone /путь/к/репозиторию | |
| Заметки Если сервер удаленный, использовать следующую команду: | Команды Git git clone username@host:/путь/к/репозиторию |
Заметки Добавить один или несколько файлов в раздел проиндексированных файлов (индекс): | Команды Git git add * | |
Заметки Сделать коммит изменений в расположение HEAD (но не в удаленный репозиторий): | Команды Git git commit -m "Комментарий к коммиту" | |
| Заметки Сделать коммит файлов, которые вы добавили командой git add, а также файлов, которые вы с тех пор изменили: | Команды Git git commit -a |
Заметки Отправить изменения в главную ветку удаленного репозитория: | Команды Git git push origin main | |
Заметки Вывести список всех файлов, которые вы изменили, а также файлов, которые еще нужно добавить или для которых нужно сделать коммит: | Команды Git git status | |
Заметки Если вы еще не подключили локальный репозиторий к удаленному серверу, добавьте сервер, чтобы можно было отправлять туда изменения: | Команды Git git remote add origin | |
| Заметки Вывести список всех настроенных на данный момент удаленных репозиториев: | Команды Git git remote -v |
Заметки Создать новую ветку и переключиться на нее: | Команды Git git checkout -b | |
| Заметки Переключиться с одной ветки на другую: | Команды Git Git checkout |
| Заметки Вывести список всех веток в репозитории с указанием текущей ветки: | Команды Git git branch |
| Заметки Удалить функциональную ветку: | Команды Git git branch -d |
| Заметки Отправить ветку в удаленный репозиторий, чтобы другие разработчики могли с ней работать: | Команды Git git push origin |
| Заметки Отправить все ветки в удаленный репозиторий: | Команды Git git push --all origin |
| Заметки Удалить ветку из удаленного репозитория: | Команды Git git push origin : |
Заметки Получить изменения с удаленного сервера и выполнить их слияние с рабочим каталогом: | Команды Git git pull | |
| Заметки Выполнить слияние ветки с активной веткой: | Команды Git Git merge |
| Заметки Просмотреть все конфликты слияния:Просмотреть конфликты с базовым файлом:Предварительно просмотреть изменения перед слиянием: | Команды Git git diffgit diff --basegit diff |
| Заметки Устранить все конфликты вручную и пометить измененный файл: | Команды Git git add |
Теги | Заметки Для пометки существенных наборов изменений, таких как релизы, можно использовать теги: | Команды Git git tag 1.0.0 |
| Заметки Идентификатор коммита — это начальные символы идентификатора набора изменений (не более 10). Он должен быть уникальным. Получить идентификатор: | Команды Git git log |
| Заметки Отправить все теги в удаленный репозиторий: | Команды Git git push --tags origin |
Заметки Если вы ошибетесь, изменения в рабочем дереве можно будет заменить последним содержимым в расположении HEAD (при этом сохранятся изменения, уже добавленные в раздел проиндексированных файлов, а также новые файлы): | Команды Git git checkout -- | |
| Заметки Вместо перечисленных действий можно удалить все локальные изменения и коммиты, извлечь последнюю историю с сервера и указать на нее в локальной главной ветке следующим образом: | Команды Git git fetch origingit reset --hard origin/main |
Поиск | Заметки Выполнить поиск «foo()» в рабочем каталоге: | Команды Git git grep "foo()" |
Инструменты миграции Git
Есть множество инструментов, которые помогут вам перенести существующие проекты из SVN в Git. Но прежде чем выбирать между ними, решите, как будете переносить код. Возможны следующие варианты:
- Перенести всю базу кода в Git и полностью отказаться от использования SVN.
- Не переносить существующие проекты в Git, но использовать Git для всех новых проектов.
- Перенести некоторые проекты в Git и продолжить работу над остальными проектами в SVN.
- Использовать SVN и Git одновременно для одних и тех же проектов.
Полный переход в Git упрощает процесс разработки, поэтому такой вариант является предпочтительным. Однако он не всегда подходит крупным компаниям с десятками команд разработчиков и сотнями проектов. Для них гибридный подход будет более безопасным решением.
Выбор инструментов миграции во многом зависит от того, какую из указанных стратегий вы предпочтете. Ниже представлено несколько наиболее популярных инструментов миграции из SVN в Git.
Скрипты миграции Atlassian
Если вы хотите быстро перейти в Git, вам подойдут скрипты миграции Atlassian. В этих скриптах есть все необходимые инструменты для надежного преобразования существующих репозиториев SVN в репозитории Git. Полученная собственная история Git поможет избежать проблем совместимости SVN и Git после перехода.
Мы подготовили полное пошаговое техническое руководство по использованию этих скриптов для преобразования всей базы кода в набор репозиториев Git. В этом руководстве подробно описывается каждый шаг — от извлечения из SVN информации об авторе до реорганизации нестандартных структур репозиториев SVN.
Плагин SVN Mirror for Stash (ныне Bitbucket)
SVN Mirror для StashSVN Mirror для Stash — это плагин Bitbucket, позволяющий без труда обслуживать гибридную базу кода, с которой можно работать в SVN и Git. В отличие от скриптов миграции Atlassian, с плагином SVN Mirror для Stash системы Git и SVN можно использовать вместе на любом этапе проекта.
Это компромиссное решение отлично подойдет крупным компаниям. С его помощью систему Git можно внедрить постепенно, чтобы разные команды могли перенести рабочие процессы в удобное для них время.
Что такое Git-SVN?
Инструмент Git-SVN — это интерфейс между локальным репозиторием Git и удаленным репозиторием SVN. Git-SVN позволяет разработчикам писать код и создавать коммиты локально с помощью Git, а затем отправлять их в центральный репозиторий SVN в качестве коммитов SVN. Этот инструмент представляет собой временное решение, однако он может принести пользу, пока команда еще не приняла окончательное решение о переходе из SVN в Git.
Git-SVN подойдет, если вы не уверены насчет перехода в Git и хотите, чтобы некоторые разработчики могли изучить команды Git, не прибегая к полноценной миграции. Эта утилита также оптимальна для этапа обучения: коллектив может постепенно выполнять переход, использовать локальные команды Git и пока не задумываться о процессах совместной работы.
Обратите внимание, что работа с git-svn — это лишь один из этапов миграции. Этот инструмент опирается на SVN для работы c серверной частью и не позволяет использовать более мощные возможности Git, такие как ветвление или расширенные процессы совместной работы.
Стратегии развертывания
При внедрении Git нужно не только продумать перенос базы кода, но и решить, как вы адаптируете к Git работающих с ней сотрудников. Внешние консультанты, внутренние сторонники Git и пилотные команды — вот три основные стратегии, которые позволят перевести команду разработчиков в Git.
Внешние консультанты по Git
Консультанты по Git могут провести миграцию целиком за символическую плату. Преимущество этой стратегии в том, что ваша команда получит оптимальный рабочий процесс Git без каких-либо затрат времени с вашей стороны. Кроме того, разработчики смогут использовать опыт экспертов во время изучения Git. Консультантами по Git могут выступить партнеры Atlassian, поскольку они хорошо осведомлены по вопросам миграции из SVN в Git.
С другой стороны, самостоятельное проектирование и внедрение рабочего процесса Git поможет команде уверенно освоить внутренние механизмы нового процесса разработки. В этом случае не придется опасаться, что команда будет брошена на произвол судьбы после ухода консультанта.
Внутренние сторонники Git
Сторонник Git — это разработчик в вашей компании, которому не терпится начать работу с Git. Услуги сторонника Git будут полезны компаниям с сильной культурой разработки и увлеченными программистами, которым нравится быть первопроходцами. Пусть один из инженеров станет экспертом по Git. Так он сможет спроектировать рабочий процесс Git с учетом потребностей компании и возьмет на себя обязанности внутреннего консультанта, когда потребуется перевести в Git остальных участников команды.
Преимущество этой стратегии по сравнению с привлечением внешнего консультанта заключается в том, что опыт работы с Git сохраняется внутри компании. Однако для обучения сторонника Git потребуется больше времени. Кроме того, существует риск, что он выберет неподходящий рабочий процесс Git или неправильно его реализует.
Пилотные команды
Третий способ перехода в Git — протестировать систему на пилотной команде. Он лучше всего подойдет небольшой команде, которая работает над относительно изолированным проектом. Кроме того, в пилотную команду можно включить внешних консультантов и внутренних сторонников Git, чтобы получить выигрышную комбинацию.
Преимуществом этой стратегии является участие всей команды. Кроме того, вы с меньшей вероятностью ошибетесь при выборе подходящего рабочего процесса, так как при проектировании нового процесса разработки предложения поступают от всех участников. То есть недостающие элементы будут обнаружены раньше, чем в случае, когда консультант или сторонник Git самостоятельно разрабатывают новый рабочий процесс.
С другой стороны, при использовании пилотной команды больше времени тратится на начальное обучение и подготовку: новый рабочий процесс изучает не один разработчик, а целая команда, и пока участники его не освоят, работа может быть менее продуктивной. Однако долгосрочная выгода совершенно точно оправдывает эти краткосрочные убытки.
Безопасность и права доступа
Контроль доступа — это один из аспектов Git, где требуется кардинально переосмыслить управление базой кода.
В рамках SVN всю базу кода обычно хранят в едином центральном репозитории и ограничивают доступ различных команд или отдельных лиц к папкам. В Git это невозможно: разработчики должны получить весь репозиторий и работать с ним. Здесь, в отличие от SVN, обычно нельзя получить только часть репозитория. Права доступа можно предоставлять только к целым репозиториям Git.
Это означает, что вам нужно разделить крупный монолитный репозиторий SVN на несколько небольших репозиториев Git. Нам в Atlassian тоже пришлось этим заниматься, когда наша команда разработчиков Jira переходила в Git. Раньше все наши плагины Jira хранились в одном репозитории SVN, а после миграции каждый плагин оказался в собственном репозитории.
Напомним, что система Git была разработана для безопасной интеграции кода от тысяч независимых разработчиков Linux, поэтому в ней можно тонко настроить контроль доступа, нужный команде. Однако для этого, возможно, придется по-новому взглянуть на цикл сборки.
Если вы беспокоитесь о сопровождении зависимостей в новом наборе репозиториев Git, вам может пригодиться уровень управления зависимостями в сочетании с Git. Уровень управления зависимостями поможет сократить время сборки, поскольку по мере роста проекта вам потребуется так называемое «кэширование» для ускорения сборки. Список рекомендуемых инструментов для уровня управления зависимостями с учетом стека технологий приводится в полезной статье «Git и зависимости проекта».
Для разработчиков
Репозиторий для каждого разработчика
Самое большое изменение, к которому вам как разработчику нужно приспособиться, — это распределенная природа Git. Вместо одного центрального репозитория у каждого разработчика есть полноценная собственная копия. Это кардинально меняет подход к совместной работе с коллегами-программистами.
Вместо того чтобы получить репозиторий SVN командой svn checkout и создать его рабочую копию, вы клонируете весь репозиторий Git на локальную машину командой git clone.
Совместная работа происходит путем перемещения веток между репозиториями с помощью команд git push, git fetch и git pull. В Git разработчики обычно делятся ветками, но это можно делать и на уровне коммитов, как в SVN. Однако в Git коммит представляет собой полное состояние всего проекта, а не изменения файла. Ветки можно использовать как в Git, так и в SVN, но важное различие заключается в том, что в Git можно выполнять локальные коммиты, не делясь своей работой. Это позволяет разработчикам свободно экспериментировать и более эффективно действовать в автономном режиме, а также ускоряет работу практически всех команд, задействованных в управлении версиями.
Однако важно понимать, что удаленный репозиторий не ссылается на чей-то чужой репозиторий напрямую. Это просто закладка, которую вы можете использовать, чтобы не вводить заново полный URL-адрес при каждом обращении к удаленному репозиторию. Пока вы явно не получите ветку из удаленного репозитория или не отправите ее туда, вы будете работать в изолированной среде.
Другое важное изменение для пользователей SVN — это «локальные» и «удаленные» репозитории. Локальные репозитории находятся на локальном компьютере, а все остальные называются удаленными. Последний нужен прежде всего затем, чтобы сделать ваш код доступным для остальных участников команды, поэтому там не ведется активная разработка. Локальный репозиторий находится на вашей локальной машине, где вы и создаете ПО.
Не бойтесь ветвления или слияния
В рамках SVN вы редактируете файлы в своей рабочей копии, а затем выполняете команду svn commit, чтобы отправить код в центральный репозиторий. После этого остальные разработчики могут перенести изменения в свои рабочие копии командой svn update. Ветки в SVN обычно создают для больших и долгосрочных частей проекта, потому что слияние сопряжено с риском и может навредить проекту.
Базовый процесс разработки в Git сильно отличается. Вместо привязки к одному направлению разработки, например к магистральному, процесс вращается вокруг ветвлений и слияний.
Начиная работу в Git, вы создаете новую ветку и переключаетесь на нее с помощью команды git checkout -b. Таким образом вы получите отдельное направление разработки, где сможете писать код, не беспокоясь о том, что ваша работа помешает другим участникам команды. Если вы непоправимо испортите код, можно будет просто удалить ветку командой git branch -d. Написав какой-либо полезный код, вы создадите запрос pull и объедините этот код с основной веткой.
Возможные варианты рабочих процессов Git
При выборе рабочего процесса Git важно учитывать потребности команды. Простой рабочий процесс может повысить скорость и гибкость разработки, а более сложный укрепит согласованность и контроль над текущей работой. Перечисленные ниже общие подходы можно адаптировать и сочетать с учетом потребностей и ролей в команде. Так, основной разработчик может взаимодействовать с функциональными ветками, в то время как подрядчик будет работать с форком.
- Централизованный рабочий процесс очень похож на обычные процессы SVN, поэтому вы можете начать с него.
- Рабочий процесс с функциональными ветками развивает эту идею: с его помощью разработчики могут изолировать текущую работу и защитить важные общие ветки. Кроме того, функциональные ветки создают основу для управления изменениями с помощью запросов pull.
- Рабочий процесс Git-flow — это более формализованное и структурированное расширение процесса с функциональными ветками, поэтому он идеально подходит для больших команд с четкими циклами релизов.
- И наконец, если вам нужна максимальная изоляция и контроль над изменениями или если в один репозиторий поступает код от нескольких разработчиков, попробуйте рабочий процесс с форками.
Но если у вас профессиональная команда, участники которой хотят получить максимум пользы от Git, вам следует обратить внимание на рабочий процесс с функциональными ветками. Это по-настоящему распределенный рабочий процесс. Он надежно защищен, легко масштабируется и отличается исключительной гибкостью.
Заключение
Переход команды в Git может отнимать много времени и сил, однако его можно облегчить. В этой статье были рассмотрены некоторые распространенные варианты переноса существующей базы кода, развертывания Git в командах разработчиков, а также решения вопросов безопасности и прав доступа. Кроме того, мы рассказали о самых серьезных проблемах, с которыми могут столкнуться разработчики в процессе миграции и к которым они должны быть готовы.
Надеемся, теперь у вас есть прочная основа для внедрения распределенной разработки в своей компании, независимо от ее размера и текущих методов разработки.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.