Очень большой репозиторий TFS — ‹ветка git tfs› из подпапки

Я буду чрезвычайно признателен за все советы о том, как приступить к следующей задаче под рукой. Я достаточно внимательно прочитал документацию по git-tfs clone, git-tfs quick-clone и git-tfs branch, но так и не смог разобраться с этой проблемой.

Наша кодовая база TFS УЖАСНО БОЛЬШАЯ (это потому, что по одиозным причинам она содержит большие BLOB-объекты и тому подобное). Однако он довольно хорошо организован и имеет следующую структуру:

 $/TeamProject/Dev (TERRIBLY LARGE)
  |
  +- $/TeamProject/Dev.EpicX (TERRIBLY LARGE)
  |
  +- $/TeamProject/Dev.EpicY (TERRIBLY LARGE)
  |
  +- $/TeamProject/Dev.EpicZ (TERRIBLY LARGE)

Каждая из этих ветвей является «законной» ветвью TFS (-vs-просто разветвленной «папкой»). Мы можем думать о ветке Dev как об основной ветке интеграции. Эти ветки содержат наши решения и проекты, а также несколько других ресурсов (как я уже упоминал, BLOB и т. д.)

Как я уже сказал, из-за смехотворного размера этих веток большинство из нас даже не утруждают себя получением ветки целиком, а только соответствующими каталогами или решениями, над которыми мы работаем. Например, я работаю в $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory в ветке Dev.EpicY. Размер исходных файлов в SolutionDirectory намного удобнее (~200 МБ). Это каталог, в котором мне нужно создать репозиторий git для работы, наслаждаясь всеми преимуществами git (локальные ветки и т. д.), не затрагивая моих коллег, которые продолжат использовать TFS.

Прежде всего: мне нужна возможность прямой интеграции путем «слияния» с соответствующим «родительским» каталогом $/TeamProject/Dev/Foo/Bar/SolutionDirectory, который постоянно развивается.


Что я пробовал

1-я попытка: клонировать все ветки

Меня не интересует предыдущая история проекта, поэтому я думаю использовать git tfs quick-clone.

git tfs quick-clone http://tfs-server/Collection $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory . --branches=all

с последующим:

git tfs quick-clone http://tfs-server/Collection $/TeamProject/Dev/Foo/Bar/SolutionDirectory . --branches=all

Когда я это делаю, я не получаю отношения ветвления родитель-потомок между Dev и Dev.EpicY. Например:

git tfs branch

Git-tfs remote details:
default -> http://tfs-server/Collection $/TeamProject/Dev/Foo/Bar/SolutionDirectory
refs/remotes/tfs/default - 04ddfd8641096a2d02eed4c087423bc0cdeb4ed7 @ 44016

2-я попытка: явно инициализировать ветки

После клонирования. Теперь я даже получаю сообщение об ошибке:

git tfs branch --init --all

error: The use of the option '--branches=all' to init all the branches is only possible 
when 'git tfs clone' was done from the trunk!!! '$/TeamProject/Dev/Foo/Bar/SolutionDirectory'
is not a TFS branch!

3-я попытка: перейдите в TFS и преобразуйте подпапки в ветки.

Кажется, что для git tfs разница между обычными папками и ветвями в TFS значительна, поэтому я перешел на TFS и преобразовал SolutionDirectory в ветку, вместе с его иерархией:

 $/TeamProject/Dev/Foo/Bar/SolutionDirectory
  |
  +- $/TeamProject/Dev.EpicX/Foo/Bar/SolutionDirectory
  |
  +- $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory
  |
  +- $/TeamProject/Dev.EpicZ/Foo/Bar/SolutionDirectory

Теперь, когда я запустил git tfs branch --init --all, был некоторый прогресс, но все равно произошел сбой со странной ошибкой:

git tfs branch --init --all

Tfs branches found:
- $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory
=> Working on TFS branch : $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory
Branches to Initialize successively :
-$/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory (43506)
The name of the local branch will be : Dev.EpicY/Foo/Bar/SolutionDirectory
error: an error occurs when initializing the branch. Branch is ignored and continuing...
=> Working on TFS branch : $/TeamProject/Dev/Foo/Bar/SolutionDirectory
warning: Some Tfs branches could not have been initialized:
- $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory

Please report this case to the git-tfs developers! (report here : https://github.com/git-tfs/git-tfs/issues/461 )
warning: Some Tfs branches could not have been initialized or entirely fetched due to errors:
- $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory
   =>error:error: Couldn't fetch parent branch

person Fernando Espinosa    schedule 05.05.2016    source источник


Ответы (2)


Документация несколько кратка, но мне, наконец, удалось достичь точной цели — создать репозиторий git только с необходимой историей и разветвленной кодовой базой из подкаталогов TFS.

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

Действительно, для того, чтобы git-tfs мог получить ветку из TFS, она должна быть веткой TFS (а не просто папкой с веткой). Но вы можете временно преобразовать нужные SolutionDirectory папки в ветки TFS! Это ключ.

Вот правильный порядок действий:

  1. Определите набор изменений TFS, когда $/TeamProject/Dev был разветвлен до $/TeamProject/Dev.EpicY для разработки ~/Foo/Bar/SolutionDirectory

    • Let's say this changeset is: 43541
  2. Убедитесь, что и $/TeamProject/Dev/Foo/Bar/SolutionDirectory, и $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory являются ветками TFS.

  3. Предполагая, что вы хотите инициализировать репозиторий git в текущем каталоге, выполните следующую команду:

    PS> git tfs clone --changeset=43541 --branches=all `
        http://tfs-server/Collection $/TeamProject/Dev/Foo/Bar/SolutionDirectory .
    
  4. Отображаемый вывод покажет, как ветвь TFS поднимается по пути и извлекаются соответствующие коммиты.

    Initialized empty Git repository in E:/git-tfs/SolutionDirectory/.git/
    Fetching from TFS remote 'default'...
    1 objects created...
    C43541 = 731d29764d88e424b9d6dfb9a34c107aa4cca9c3
    C43608 = aebc94b96079e73e88ea74ed859eec65440c3b03
    C43609 = 64c03137f555345ec7f24fefc992162e6e082a98
    ...
    C44016 = e1b5c55efa528733ecaa3afba31b05cf1a310cb4
    Tfs branches found:
    - $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory
    => Working on TFS branch : $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory
    Branches to Initialize successively :
    -$/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory (43506)
    The name of the local branch will be : Dev.EpicY/Foo/Bar/SolutionDirectory
    C43541 = 73589d08398415549fbad191b06c55a272c7ca37
    C43666 = c4bbe9b09138331041cb958cbc8b89f16f7a2902
    C43670 = e7c1e4c787c6c4a745baed46da0eb5d0e3f2fc79
    ...
    C44019 = b2401575dec8347e1debc701073f523aa09e668c
    => Working on TFS branch : $/TeamProject/Dev/Foo/Bar/SolutionDirectory
    
  5. Будьте счастливы :)

person Fernando Espinosa    schedule 07.06.2016

Команда clone создает новый git репозиторий, инициализированный из исходного дерева TFS, и извлеките все наборы изменений, которые содержат --branches=VALUE синопсис.

Команда quick-clone создает новый репозиторий git, инициализированный последним набором изменений (или определенным набором изменений в истории) в исходном дереве TFS, игнорируя полную историю, которая не содержит --branches=VALUE синопсиса.

И, чтобы использовать функцию Клонировать все ветки, все папки вашего исходного кода, соответствующие ветвям, должны быть преобразованы в ветки.

В сообщении об ошибке указана ошибка «ошибка: использование параметра «-branches = all» для инициализации всех веток возможно только тогда, когда «git tfs clone» был выполнен из магистрали !!!», на мой взгляд, вам нужно использовать клонировать только ствол (с ветвями зависимостей), проверьте: https://github.com/git-tfs/git-tfs/blob/master/doc/commands/clone.md

person Cece Dong - MSFT    schedule 06.05.2016
comment
Вы правы, разветвленные папки в TFS необходимо преобразовать в ветви TFS (глупое различие), чтобы процесс мог их подобрать. Но оказывается, я всегда могу сбросить ветвление папки TFS по желанию и воспользоваться этим, чтобы клонировать ТОЛЬКО желаемый объем кода и истории, как я описываю ниже. Спасибо в любом случае за ваш ответ. - person Fernando Espinosa; 07.06.2016