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

Как использовать git -tfs Idiomatically?

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

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

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


Клонировать весь репозиторий TFS

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

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

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

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

Добавить удаленный ветвь в TFS

Я не знаю, могу ли я (или как) сопоставить удаленный файл git для каждой ветки 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 очень велико, эксперимент длится долго)

Ответ 1

Теперь возможно, чтобы ветки 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

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

Ответ 2

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

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

Ответ 3

Как насчет нескольких удаленных tfs-repos, 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

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

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