Как использовать 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