git insert cambios históricos del subdirectory

Entiendo que esto puede sonar como una pregunta extraña …

Tengo un repository en github https://github.com/milovanderlinden/NLExtract

Tiene un "bolso" de subdirectory que se originó de: https://github.com/MinIenM/BAG-Extract

Durante la creación de NLExtract, omitimos accidentalmente fusionar BAG-Extract correctamente mientras se mantiene el historial.

Para mantener los créditos a los autores originales, me gustaría get el historial de confirmación completo de BAG-Extract en NLExtract / bolsa.

¿Sería eso posible? ¿Algún consejo sobre cómo hacer esta "inyección de historia"?

Creo que puedo ayudarlo con esto, ya que anteriormente necesitaba hacer algo similar.

La desventaja es que mi solución va a requerir un poco de reescritura de la historia. Si tienes muchos queueboradores, esto será doloroso ya que la historia de todos va a cambiar. Realmente no conozco ninguna forma de evitar esto, porque incluso algo tan simple como agregar un padre antes de su raíz actual cambiará el commit msg o nuestro antiguo root, que cambia su SHA, que afecta ese campo padre de su hijo, que cambia su SHA, y así sucesivamente.

Al mirar su repository en github, parece que solo tiene un par de contribuyentes, por lo que no es tan peludo.

También estoy asumiendo que el repository de bolsas en https://github.com/MinIenM/BAG-Extract no ha progresado desde que lo leíste, que al leer la date de sus confirmaciones y las confirmaciones de BAG-Extract supongo que es el caso.

Como parece que su objective es solo dar crédito, una fusión de subtreees es probablemente para usted.

Básicamente haremos lo siguiente:

  1. Lea en BAG-Extract como una nueva twig. No compartirá ninguna historia común.
  2. Identifica en qué parte de tu historial trajiste el subdirectory de la bolsa. Llamaremos a esto "bagin"
  3. Agregue un nuevo compromiso de fusión que tendrá la última confirmación BAG-Extract y el compromiso de (2) como padres. Será una combinación de subtree, por lo que la idea es que los dos padres difieran solo en que uno está prefijado con un subtree (p. Ej., Bolsa /)
  4. Rebase todo su historial de publicaciones "bagin" en este object de fusión.

Aquí hay un código para hacerlo. Para estar seguro, cloné las cosas en un repository nuevo que puedes tirar si las cosas no salen según lo planeado

git clone git@github.com:milovanderline/NLExtract git log -- bag #Identify the first commit where "bag" enters. It starts with 78575 git checkout 78575 -b bagin git remote add bag git@github.com:MinIenM/BAG-Extract git fetch bag git checkout bagin -b baginmerge git merge bag/master -s subtree #Create the new merge object. baginmerge now points to the merge object. bagin, which hasn't moved, now has two children, one is the merge object, the other is your old history. git rebase --onto baginmerge bagin master -p #Calculate the diffs from bagin to master, and replay them onto baginmerge. The -p flag tells rebase to preserve merges. 

De hecho, ya he bifurcado su repository y he realizado los pasos anteriores. En mi repository en https://github.com/dankessler/NLExtract encontrará una nueva twig llamada rebased_master. Siéntase libre de hacer esto. Desafortunadamente, al mirar su gráfico de networking, las personas se han desconectado de su repository, y esto probablemente lo arruine, pero deberían ser capaces de volver a establecer las bases o seleccionar las actualizaciones futuras, ya que los contenidos de sus compromisos debe ser idéntico, solo han cambiado sus SHA.

Si revisa http://help.github.com/subtree-merge/, la estrategia de fusión del subtree es en su mayoría similar, ya que esto le permitirá get desarrollo futuro de BAG-Extract si lo desea.

Puedo pensar en otra estrategia que haría que parezca que el desarrollo de la bolsa originalmente había sucedido como un subtree de su repository (pero con la identificación del autor adecuada), pero probablemente eso no sea lo que está buscando. Lo bueno de esto es que las utilidades como la culpa de git y otras cosas pueden funcionar mejor, pero es mucho más complicado y requiere la function de git filter-branch que normalmente escucho se debe evitar cuando sea posible. Sin embargo, si quieres seguir esa ruta, házmelo saber y te explicaré con más detalle.

¡Mucha suerte y aplausos!