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

Как я использую git-tfs идиоматически?

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

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

Используя 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 ответа

Решение

Теперь можно сделать ветки 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

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

Вот один способ, которым вы можете сделать это, и при этом поддерживать некоторые отношения между мастером и ветвями. Возможно, вы захотите написать сценарий. Извините, если я использую операторы 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 должен подойти, если вы перезаписали файл другим файлом, но содержимое не изменилось, что позволяет работать всем этим.

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

А как насчет нескольких удаленных репозиториев tfs, по 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

Другие вопросы по тегам