¿Cómo puedo fusionar los cambios de una twig que contiene un subset de directorys de otro?

Trataré de mantener esto breve.

Tenemos un repository git que actúa como un espejo SVN (administrado por BitBucket). Este repository contiene todos los proyectos de la empresa desde el comienzo de los times y tener a cada desarrollador clonado no es una request razonable (25 + 33GiB clon completo y 15 + GiB superficial) Pero incluso así, no necesitamos un clon completo del repository completo, solo un subset de los directorys dentro de.

Usando git-subtree, logré dividir todos los directorys de interés y pensé que podríamos agregar estos directorys en nuestros repositorys locales usando git-subtree add. Este process es transparente para el repository svn. Esto funciona bien y el tamaño es mucho más manejable (9 + 6GiB full clone y 8GiB superficial). El problema es que no sé cómo podríamos tomar los cambios que hacemos en estos "clones parciales" y fusionarlos nuevamente en la twig principal.

Pensé que podríamos usar las requestes de extracción habituales para introducirlas, pero como los treees de las twigs son diferentes, no se comportan como yo quisiera (los directorys faltantes se tratan como eliminaciones). Solo quiero fusionar los cambios de los directorys clonados y dejar los otros intactos.

No creo que usar un checkout escaso sería útil aquí ya que todavía tendríamos que clonar el repository completo para que funcione, que es exactamente lo que estoy tratando de evitar.

¿Hay alguna combinación de commands que pueda usar para hacer que todo funcione?


Aquí están los scripts (modificados) que utilicé para dividir los directorys y para consultar los directorys de interés:

split_projects.sh
Usé git-subtree para dividir y volver a unirme a los directorys y usé git-replace para mejorar la velocidad de resplitting (para procesar solo las nuevas confirmaciones). Tenga en count que la reincorporación no está comprometida con el repo principal (no estoy dispuesto a tratar de comprometerlo especialmente con el espejo svn).

initial_setup.sh
Este es el guión para preparar el repository local. Para ser utilizado por los usuarios de Windows, muchos de los cuales no tienen mucha experiencia con herramientas git o de command-line.

checkout_projects.sh
El script de pago real

Hay otro que extrae las actualizaciones de los subdirectorys divididos, pero no lo incluyo aquí.

Si no desea que se fusionen algunos cambios, realice su fusión --no-commit y deshaga esos cambios en el resultado de fusión antes de --no-commit . Para eliminaciones no deseadas, solo tienes que git checkout la versión que quieras. Para git checkout --patch cambio no deseados, git checkout --patch .

Otra opción, que podría ser más simple si solo está doblando en subtreees de nivel superior que faltan en la twig fusionada, es hacer la fusión y enmendarla después, un (git ls-tree @; git ls-tree @^1|grep ^04)|sort -usk4 | git mktree (git ls-tree @; git ls-tree @^1|grep ^04)|sort -usk4 | git mktree generará el tree correcto con la suficiente facilidad, por lo que

 fixup=`(git ls-tree @; git ls-tree @^1|grep ^04)|sort -usk4|git mktree` commit=`git show -s --pretty=%B @|git commit-tree -p @^1 -p @^2 $fixup` git update-ref -m 'fold in missing subdirectories' @ $commit 

después de la fusión y listo.

en su caso, me temo que debe usar selects de cereza para mover los cambios al repository original

La mejor solución que tengo es que ejecutes lo siguiente en una salida dispersa de un clon superficial del repository raíz:

 git checkout -b branch-to-PR-in git fetch remote-with-subtree-as-root git merge -s recursive -X theirs -X subtree=path/in/root/to/subtree/ remote-with-subtree-as-root/master --allow-unrelated-histories -X theirs 

Si entiendo tus scripts correctamente:

dentro de bigrepo , un $project tiene su historial en branch subdirs/$project , y su contenido en el directory raíz del repository
por ejemplo: si ejecuta git checkout subdirs/$project en bigrepo , el contenido del proyecto se encuentra en / (no en algún subdirectory adicional).

Si este es el caso :

Creo que una secuencia de git subdir push -P $project debería funcionar:

  • uno de lo que sea "repo local" para el repository dividido
  • uno del repository dividido al bigrepo