Как использовать git-tfs и идиоматическое git-ветвление в TFS-хранилище - PullRequest
49 голосов
/ 27 февраля 2011

Как мне использовать git-tfs идиоматически?

  • Идиома git - извлекать ветки в корневой каталог хранилища. Извлечение ветви заменит содержимое каталога содержимым этой ветви.

  • Идиома TFS состоит в том, чтобы извлекать каждую ветвь в отдельном каталоге в корневом каталоге хранилища (даже в основной или магистральной ветви). Извлечение ветки поместит ее в новый каталог рядом с текущим.

Используя git-tfs , я могу клонировать репозиторий TFS или перейти в репозиторий git. Я хочу, чтобы работал с репозиторием TFS с несколькими ветвями в соответствии с идиомой ветвления git . Но я не уверен, что это технически возможно или рекомендовано:)


Клонирование всего хранилища TFS

Если я клонирую весь репозиторий из TFS

> git tfs clone http://<tfsurl>:8080 $/main

Это дало бы мне мерзавец master, содержащий все ветви TFS в качестве каталогов.

[master]> dir
  trunk
  feature-logon
  feature-search
  release-0.0.1

Добавление удаленного на ветку TFS

Я не знаю, могу ли я (или как) сопоставить git remote с каждой веткой TFS.

> git init .
[master]> git tfs clone http://<url> $/main/trunk .

Тогда

[master]> git checkout -b feature-logon
[feature-logon]> git tfs clone http://<url> $/main/feature-logon .

Я знаю, что это технически неверно, но я не знаю лучше без игры (мое единственное репозиторий TFS очень большое, эксперименты занимают много времени)

Ответы [ 3 ]

32 голосов
/ 04 декабря 2012

Теперь возможно получить правильные ветви TFS для веток Git при клонировании с использованием git-tfs .Это сейчас в стабильной версии!Сначала вы клонируете не весь репозиторий, а транк:

git tfs clone http://<tfsurl>:8080 $/main/trunk

Затем вы запускаете branch --init, что создает новую ветку в репозитории Git

git tfs branch --init $/MyProject/MyTFSBranch

в вашем случае:

git tfs branch --init $/main/feature-logon

Или используйте флаг --all в новом клонированном репозитории, чтобы создать ВСЕ ветви, присутствующие на сервере TFS.

git tfs branch --init --all

Вы также можете клонировать напрямую со всеми веткамииспользование флага --with-branches:

git tfs clone http://<tfsurl>:8080 $/main/trunk --with-branches

Документация для этой новой команды: здесь .Не стесняйтесь оставить отзыв, чтобы улучшить его ...

3 голосов
/ 07 сентября 2011

А как насчет нескольких удаленных репозиториев, по 1 на ветку? У меня есть следующая структура:

$/Root/Main/someproject (the trunk)
$/Root/Releases/Branch1/someproject
$/Root/Releases/Branch2/someproject

что я сделал

git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Trunk GitRepo
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch1 GitRepo -i 
    branch1
git tfs quick-clone http://tfs:8080/tfs/defaultcollection $/Root/Releases/Branch2 GitRepo -i branch2

тогда вы можете создать ветку для каждой удаленной ветки: git checkout -b localbranch1 tfs/Branch1 и зафиксировать в ветке tfs git tfs ct -i branch1

Чтобы можно было легко объединить две линии, создайте трансплантат:

echo branch-commit-id trunk-parent-id > .git/infos/grafts

где идентификаторы - это хэш первого коммита ветвления (из репозитория Releases) и идентификатор родительского коммита (поиск вручную)

PS: я получаю сообщение об ошибке: Указанный каталог репозитория git также не пустой (не знаю, как он работал раньше), поэтому я вручную добавил второй URL-адрес в .git / config и сделал git tfs fetch -i Branch1

3 голосов
/ 06 апреля 2011

Вот один из способов, которым вы можете сделать это, и при этом поддерживать некоторые отношения между мастером и ветвями. Возможно, вы захотите написать сценарий. Извините, если я использую операторы bash, а не командную строку Windows для некоторых моих примеров

Сначала клонируйте весь репозиторий, как в первом примере, с ветвями в качестве каталогов.

Это перемещает ствол к корню. (надеюсь, что нет конфликтов с папками вашей ветки)

mv trunk/*.* .

Зафиксируйте своего нового мастера

git commit -a -m "refactoring master"

создание новой ветки

git checkout -b feature-login

Копирование файлов ветки поверх корневых файлов

mv feature-login/*.* .

Они здесь больше не нужны

rm -rf [all_branch_directories]

Зафиксируйте ветку

git commit -a -m "refactoring feature-login"

назад к мастеру

git checkout master

Сделай все снова

git checkout -b next_branch

и т.д.. и т.д ..

Наконец, в конце

git checkout master
rm -rf [all_branch_directories]
git commit -a -m "refactoring master"

Это не идеально, но в итоге все ваши ветви будут клонированы от мастера и разнесены более или менее соответствующим образом. AFAIK git должен подойти, если вы перезаписали файл другим файлом, но содержимое не изменилось, что позволяет работать всем этим.

Недостатком является то, что вы не будете удалять файлы в ветвях, которые были удалены из ствола. Это может или не может быть проблемой для вас ...

...