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

как использовать Git-TFS идиоматически?

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

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

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


клонировать весь репозиторий 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 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/*.* .

Commit твой новый хозяин!--10-->

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

etc. так далее..

наконец-то в конце

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

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

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