2012-02-27 24 views
7

¿Cómo elimino las confirmaciones que están desvinculadas master?Quitar confirmaciones de Git en una rama

He agregado una biblioteca grande, junto con un historial de confirmación muy rico (y que es anterior a mi código) a un subdirectorio a través de Git subtree. Me gustaría retroactivamente aplastar todo el historial, , pero aún así poder fusionar los nuevos commits con la biblioteca.

He intentado varias combinaciones de git rebase pero nunca obtengo el resultado esperado [*].

Mi repositorio se ve algo como:

A---B-----------F---G master 
      /
    ... C---D---E 

y me gustaría para que se vea algo como:

A---B-----------F'--G' master 
      /
       E' 

o:

A---B-------E'--F'--G' master 

[*]:

  • git rebase --onto C E master
  • git checkout F; git rebase --onto C E master
+0

La fusión se verá afectada por tal aplastamiento. ¿Por qué quieres aplastarlo? ¿Solo para limpiar la salida de registro de gitk/git? –

+0

Sí, eso y el hecho de que todas las confirmaciones anteriores ascienden a varios cientos de megabytes. – Gingi

+0

Su decisión de importar una biblioteca integrando su historial de desarrollo en el repositorio del proyecto es extraña. – Deestan

Respuesta

1
  1. Esta es la edición de la historia. Usted va a terminar en algo así como

    A---B-----------F'---G' master 
          /
           E' 
    
  2. La fusión será un problema después de esto, debido a Git no será capaz de encontrar a los padres comunes entre su historia y la historia de las bibliotecas.

  3. hacerlo realmente lo que necesita

    1. Restablecer para B (la creación de la etiqueta o de la rama de G para mantenerlo alrededor)
    2. realizar combinación con --no-commit.
    3. Rebase o cereza-escoge G aquí (será G ')

    La historia se verá como

    A---B-----------F'---G' 
    

Para hacer el clon superficial de la biblioteca, tienes que hacer algo como esto (Advertencia: no probado):

  1. Guardar compromete a F (sin incluir) a G (incluido) a un parche (git format-patch F --stdout > ~/saved_commits.patch)
  2. Restablecer para B. Asegúrese de que no hay ramas que se poiting a F, E o G
  3. Retire el mando a distancia, junto con su de espacio de nombres ref git remote rm
  4. reflogs Borrar: git reflog expire --expire=now --all
  5. quitar verdaderamente las cosas desde git: git gc --prune=now.Ahora deberías ver que el repositorio se encoge.
  6. Vuelva a agregar el control remoto para la biblioteca.
  7. git fetch --depth=10 libraryremote
  8. Repita la fusión (la forma habitual)
  9. Aplicar confirmaciones guardados (git am ~/saved_commits.patch).

Para migrar a la solución submódulos (probablemente la mejor opción), es necesario revertir al estado anterior a la fusión y establecer submódulos, a continuación, sustituir a cada uno se fusionan con id-comprometerse cambiado para submódulo. A diferencia del case of splitting out project directory to submodule no conozco la solución automatizada para esto (pero puede implementarse de la misma manera).

+0

¿Por qué no puede 'E'' tener' F', no 'F'', como su padre (lo mismo ocurre con' F'' y 'G')? – Gingi

+1

s/parent/child/ –

+0

Número de confirmación == commit hash. Cambiar padre significa cambiar este compromiso significa cambiar el hash de este compromiso significa cambiar el número de este compromiso. La edición de historial hace ondas que cambian todas las confirmaciones hasta la más reciente. –

Cuestiones relacionadas