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