Статьи

Миграция из TFS в Git

Вы используете TFS и хотели бы перейти на распределенную VCS, такую ​​как Git? Ну, тогда эта статья может помочь. Я быстро записал необходимые шаги и некоторые советы по экспорту существующего репозитория TFS в Git.

На самом деле я написал заметки к этой статье пару лет назад, когда мы перешли на Git (с Gitlab) на работе. Тем не менее, время от времени мне приходится переносить более старые проекты, которые находятся на TFS, на Git, а учитывая, что Microsoft недавно перешла на Git, а также внутренне (по крайней мере, для своих проектов OSS), эта статья может оказаться актуальной :).
То, что я не хотел бы обрисовать в общих чертах, является деталями того, почему мы сделали переход. Это было что-то связанное с более современным веб-интерфейсом, предлагаемым GitLab, сообществом, в основном живущим на GitHub с Git, и возможностью простого, быстрого (и локального) ветвления и слияния.

Другие посты, связанные с Git, могут вас заинтересовать:

Таким образом, при миграции вы можете просто скопировать файлы и создать новый репозиторий Git (с помощью git init ). Но обычно это то, что ты не хочешь делать. Особенно в большом проекте вы определенно хотите сохранить историю репозитория. В результате вам необходимо правильно экспортировать репозиторий TFS. Вот где Gittf вступает в игру.

Проект gittf

gittf — это проект на Codeplex, который, похоже, движет сама Microsoft, по крайней мере, сотрудники Microsoft.

Git-TF — это набор кроссплатформенных инструментов командной строки, которые облегчают обмен изменениями между Microsoft Team Foundation Server, Visual Studio Online и Git. […] Эти инструменты позволяют легко клонировать источники из TFS, получать обновления из TFS и обновлять TFS с помощью изменений, зафиксированных локально в Git.

Хотя предполагается, что он способен использовать git с центральными репозиториями на основе TFS, я никогда не использовал его таким образом. Пробовал пару раз, но идея о такой «гибридной» ситуации была для меня слишком страшной. Там, где инструмент полезен, для нашего случая использования миграции с TFS на git.

Вы можете либо установить его, как описано на странице кодового комплекса gittf, либо просто загрузить последнюю версию, разархивировать все и выполнить свои команды прямо из этого каталога. Просто убедитесь, что ваша система соответствует минимальным требованиям, таким как установка Java и т. Д.

Экспорт

Первый шаг — найти URL-адрес вашего TFS-сервера и соответствующее местоположение проекта. Это не должно быть слишком сложно. Просто найдите его в своем плагине для Visual Studio Source Control Explorer.

Примечание: я протестировал все эти команды из Git Bash, который является моей предпочтительной командной строкой в ​​Windows, особенно для взаимодействия с Git.

Получив URL-адрес, откройте консоль, где у вас есть доступ к git-tf, и выполните эту команду (очевидно, изменяя расположение):

1
$ git tf clone http://yourtfsserver:8080/tfs/colletionname $/TeamProjectA/Main --deep

Вы также можете найти эту команду в документации Codeplex . Обратите внимание, не забудьте включить –deep, чтобы извлечь всю историю версий. В противном случае будут выбраны только самые последние изменения, которые вам не нужны в сценарии полного экспорта.

Убираться

git-tf создает тег git для каждого набора изменений TFS. Это может быть полезно для перехода к конкретному коммиту TFS из Git. При экспорте репо они вам обычно не нужны. Итак, чтобы удалить их все из локального репозитория git, выполните

1
$ git tag -l | xargs git tag -d

Если вы случайно уже отправили их в удаленный репозиторий Git, эта команда может оказаться полезной

1
$ git ls-remote --tags origin | awk '/^(.*)(\s+)(.*[0-9])$/ {print ":" $2}' | xargs git push origin

Если у вас уже есть другие теги, вы можете адаптировать указанную выше команду, чтобы перехватывать только теги TFS:

1
$ git ls-remote --tags origin | awk '/^(.*)(\s+)(.*TFS.*[0-9])$/ {print ":" $2}' | xargs git push origin

Настройте имена коммиттеров

Другой сценарий, с которым вы можете столкнуться, заключается в том, что имена коммиттеров отличаются в TFS, а не в Git . Git обычно идентифицирует коммиттеров по их настроенному адресу электронной почты, в то время как TFS обычно использует вашу идентификацию Windows. В результате одно и то же лицо может быть представлено двумя разными «коммиттерами» в репозитории Git. По имени пользователя TFS из-за импорта и реального пользователя git для новых коммитов, которые сделаны в репозитории Git. Конечно … речь идет о косметике, но все же …

К счастью, быстрый поиск в Google привел меня к этому сообщению Stackoverflow , в котором была показана команда filter-branch .

В Git bash используйте эту команду:

01
02
03
04
05
06
07
08
09
10
11
git filter-branch -f --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<old TFS user>" ];
        then
                GIT_COMMITTER_NAME="<new name>";
                GIT_AUTHOR_NAME="<new name>";
                GIT_COMMITTER_EMAIL="<new - email>";
                GIT_AUTHOR_EMAIL="<new - email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

В командной строке Windows используйте это:

01
02
03
04
05
06
07
08
09
10
11
git filter-branch -f --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<old TFS user>" ];
        then
                GIT_COMMITTER_NAME="<new name>";
                GIT_AUTHOR_NAME="<new name>";
                GIT_COMMITTER_EMAIL="<new - email>";
                GIT_AUTHOR_EMAIL="<new - email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

Вывод

Вот и все, с этими командами миграция довольно проста. Для экспорта и корректировки имен коммиттера может потребоваться некоторое время. Очевидно, это зависит от размера экспортируемого хранилища.

Спасибо Алексу Рухлину из Microsoft, который очень помог в отладке и решении некоторых неприятных исключений (и ошибок), с которыми я столкнулся во время экспорта с помощью gittf. Спасибо чувак!

Ссылка: Перейдите с TFS на Git от нашего партнера JCG Юри Стрампфлохнера в блоге Юри Струмпфлохнера на TechBlog .