Repositorio TFS muy grande – <git tfs branch> desde una subcarpeta

Apreciaré enormemente todos los consejos sobre cómo proceder con la siguiente tarea. He leído bastante a background la documentation sobre git-tfs clone , git-tfs quick-clone y git-tfs branch pero todavía no he podido resolver este problema.

Nuestra base de código TFS es TERRIBLEMENTE GRANDE (es así porque por razones odiosas contiene BLOB grandes y demás). Sin embargo, está bastante bien organizado y tiene la siguiente estructura:

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

Cada una de estas twigs son sucursales "legítimas" de TFS (-vs- simplemente ramificadas "carpetas"). Podemos pensar en la twig Dev como la principal twig de integración. Estas sucursales contienen nuestras soluciones y proyectos, así como varios otros resources (como mencioné, BLOB, etc.)

Como dije, debido al tamaño ridículo de estas twigs, la mayoría de nosotros ni siquiera nos molestamos en search una twig en su totalidad, sino solo en los directorys o soluciones correspondientes en los que estamos trabajando. Por ejemplo, estoy trabajando en $ / TeamProject / Dev.EpicY / Foo / Bar / SolutionDirectory en la twig Dev.EpicY . El tamaño de las fonts en SolutionDirectory es mucho más manejable (~ 200MB). Este es el directory que necesito para crear un repository git para trabajar mientras disfruto de todas las bondades git (sucursales locales, etc.) sin afectar a mis colegas que seguirán usando TFS.

Sobre todo: necesito poder integrar hacia adelante "fusionando" del correspondiente "padre" $ / TeamProject / Dev / Foo / Bar / SolutionDirectory que está en constante desarrollo.


Lo que he intentado

1er bash: clonar con todas las twigs

No estoy interesado en la historia pasada del proyecto, así que estoy pensando en usar 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

Cuando hago esto, no obtuve la relación de bifurcación padre-hijo entre Dev y Dev.EpicY . Por ejemplo:

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

Segundo bash: Inicializar las twigs de forma explícita

Después de la clonación. Ahora incluso recibo un error:

 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! 

Tercer bash: ir a TFS y convertir las subcarpetas a sucursales

Parece que para git tfs la distinción entre carpetas regulares vs twigs en TFS es significativa, así que fui a TFS y convertí SolutionDirectory a una twig, junto con su jerarquía:

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

Ahora cuando ejecuté git tfs branch --init --all hubo algún progreso, pero aún así falló con un extraño error:

 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 ignonetworking 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 

El command clon crea un nuevo repository git, inicializado desde un tree de fonts TFS y recupera todos los sets de cambios, que contiene --branches=VALUE sinopsis.

El command quick-clone crea un nuevo repository git, inicializado desde el último set de cambios (o un set de cambios específico en la historia) en un tree de fonts TFS, ignorando el historial completo, que no contiene --branches=VALUE sinopsis.

Y, para usar la function Clonar todas las twigs, todas las carpetas de códigos fuente correspondientes a las twigs se deben convertir en twigs.

El post de error ha indicado el error "error: el uso de la opción '–branches = all' para iniciar todas las twigs solo es posible cuando 'git tfs clone' se hizo desde el trunk !!!", en mi opinión, necesita usar clonar solo el tronco (con twigs de dependencia), verifique: https://github.com/git-tfs/git-tfs/blob/master/doc/commands/clone.md

La documentation es algo escueta, pero finalmente logré el objective preciso de crear un repository git con solo la historia necesaria y la base de código ramificada de los subdirectorys TFS.

Resulta que la recomendación de clonar un enlace troncal no significa que tenga que clonar todo el historial del enlace troncal y sus twigs, y no que esté obligado a permanecer en la carpeta TFS de nivel superior como una sucursal.

De hecho, para que git-tfs recoja una twig de TFS, debe ser una twig TFS (no solo una carpeta que se ha ramificado). ¡Pero puede convertir temporalmente las carpetas deseadas de SolutionDirectory en sucursales de TFS! Esta es la key.

Este es el order correcto de acciones a tomar:

  1. Identifique el set de cambios de TFS cuando $/TeamProject/Dev se ramificó en $/TeamProject/Dev.EpicY para el desarrollo de ~/Foo/Bar/SolutionDirectory

    • Digamos que este set de cambios es: 43541
  2. Asegúrese de que $/TeamProject/Dev/Foo/Bar/SolutionDirectory y $/TeamProject/Dev.EpicY/Foo/Bar/SolutionDirectory sean twigs de TFS

  3. Suponiendo que desea inicializar el repository de git en el directory actual, ejecute el siguiente command:

     PS> git tfs clone --changeset=43541 --branches=all ` http://tfs-server/Collection $/TeamProject/Dev/Foo/Bar/SolutionDirectory . 
  4. La salida mostrada mostrará cómo se recoge la twig TFS a lo largo del path y se obtienen las confirmaciones correspondientes

     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. Sé feliz 🙂