¿Cómo extraer un subset de la historia de Git?

Actualización: traté de simplificar el ejemplo real aquí para get una explicación clara de mis opciones, pero eso realmente no funcionó. Los ejemplos vinculados que se muestran a continuación son demasiado generales para que incluso este simple ejemplo funcione.

Pude hacer todo este tipo de cosas con SVN todo el time y me volví bastante hábil en eso. Ahora me resulta extremadamente difícil en Git y empiezo a creer que mi historia es básicamente demasiado mundana para poder desmantelarla.

Problema del mundo real: I alnetworkingedor de una docena de files que se han movido y cambiado de nombre. Su historia está entremezclada con la historia de cientos de otros files para los cuales quiero eliminar completamente el historial.

En SVN, podría usar una secuencia de dump / include-filter / exclude-filter / load para recortar el repository y rara vez podría necesitar cambiar el nombre de las routes manualmente en el file de volcado antes de cargarlo.

Algo así y yo habría terminado:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa svnadmin dump FooSrc > Full.dump 2> Dump.log svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Full.dump > Filter_1.dump 2> Filter_1.log svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Filter_1.dump > Filter_2.dump 2> Filter_2.log svnadmin create FooDest svnadmin load FooDest --ignore-uuid < Filter_2.dump > Load.log 2> Load_Errors.log 

¿Alguien tiene un buen ejemplo de esto que es más que una simple eliminación de un único file o export de un solo subdirectory?

La forma más sencilla en que puedo definir el set de files es con una list de 7 routes de directory. Todo lo que hay dentro de esos directorys debe mantenerse y todo lo que se encuentra afuera debe ser borrado del historial.


Problema simplificado:

Tengo un repository de Git que tiene un puñado de files que me gustaría extraer en su propio repository. El problema es que estos files fueron creados y modificados a lo largo de la historia del repository original, así que estoy teniendo problemas para descubrir cómo extraerlos limpiamente.

Aquí está una noción de cómo se ve mi historia (solo con más compromisos y mucho más para ignorar). Como puede ver, obviamente no planeé que estos files fueran elegidos después de la historia:

 commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56 M src/Foo/Bar/FileToExtract2.foo A src/Foo/Bar/FileToExtract3.bar D src/Foo/AnotherFileToIgnore.txt commit 05d26f23518083270cc45bf037ced29bec45e064 M src/Foo/Blah/IgnoreThisOneToo.foo M src/Foo/AnotherFileToIgnore.txt commit 343187228f4bd8e4427395453034c34ebd9a95f3 M src/Foo/Bar/FileToExtract1.txt M src/Foo/AnotherFileToIgnore.txt commit 46a0129104ac31291462f657292aab43f8883d8d A src/Foo/Bar/FileToExtract1.txt A src/Foo/Bar/FileToExtract2.foo M src/Foo/FileToIgnore.txt commit 3fe6af56f0d8dc42fcb5b0bafee41bff534ba2cc A src/ReadMe.txt A src/IgnoreMe.foo A src/Foo/FileToIgnore.txt A src/Foo/Blah/IgnoreThisOneToo.foo A src/Foo/AnotherFileToIgnore.txt 

Al final, lo que quiero es un repository limpio con el historial completo de solo los files en src/Foo/Bar/ . El rest puede ser ignorado. También estoy de acuerdo con mantener este repository tal como está (es decir, sin reescribir el historial) y solo realizar una eliminación para ese directory completo.

En SVN, usaría svnadmin dump , svndumpfilter y svnadmin load . Si tuviera cuidado, podría incluso editar manualmente el file de volcado para limpiar routes, etc.

He estado revisando los commands de Git y no puedo ver una forma de hacerlo. Cualquier ayuda sería muy apreciada.

Puede usar git filter-branch y separar el directory Foo en su propio directory.
Ver:

  • " Separar el subdirectory en un repository separado de Git ".
  • "¿ Cómo extraer un subdirectory git y hacer un submodule de él? ", Que ilustran el inverso (eliminar todo less los files que desea conservar).

El equivalente de svnadmin dump , svndumpfilter y svnadmin load sería git fast-export , un script propio (ver ejemplos ) y git fast-import .