2010-12-22 39 views
10

Tengo un proyecto de git que se ha ejecutado por un tiempo y ahora quiero deshacernos de la vieja historia, digamos desde el principio hasta hace dos años. Con throw away me refiero a reemplazar los muchos commits dentro de este tiempo con un solo commit haciendo lo mismo.Aplana la vieja historia en Git

Comprobé git rebase -i pero esto no elimina el otro historial (completo) que contiene todos los commits de git.

He aquí una representación gráfica (siendo d) los conjuntos de cambios:

(base) -> d1 -> d2 -> d3 -> (HEAD) 

Lo que quiero es:

(base) -> d1,d2 -> d3 -> (HEAD) 

¿Cómo podría hacerse esto? Gracias.

EDITAR

lo tengo trabajando con

git rebase -i cd1e8c9 

con cd1e8c9 siendo la revisión de inicio (base) y calabaza. Luego usé la corrección para combinar las revisiones. Gracias.

+0

posible duplicado de [Colapsando el historial de un repositorio git] (http://stackoverflow.com/questions/250238/collapsing-a-git-repositorys-history) – Shawn

Respuesta

10

Si realmente no te importa todo el historial, otra forma simple de hacerlo sería tomar la rama actual y crear una rama huérfana basada en esto. A continuación, agregue todos los archivos a esta rama y realice una confirmación inicial (que perdería todo el historial). Esto puede ser enviado al repositorio remoto.

Suponiendo que se encuentra en la rama que desea aplanar. Primero compruebe si está limpio:

git status -s 

El comando anterior no debe dar salida a nada.

Ahora crear una rama huérfano:

git checkout --orphan flattened 

Añadir todos los archivos

git add . 

Crear única confirmación

git commit -m "Initial flattened commit" 

comprobar si todo está como quería y empuje a distancia (ex) :

git status -s 

# (original_branch being the branch with the full history) 
git diff original_branch..flattened 

# (assuming your remote is origin and the branch to overide is master) 
# Think twice before doing this! 
git push origin +flattened:master 
+0

¿Qué se proponía hacer? Dando esto una oportunidad, hice lo anterior y el servidor se quedó con la rama original (maestra) con no menos compromisos, de hecho, tenía uno más, el compromiso de "aplanamiento" que acaba de ser empujado. Tirando a maestro local también mostró no menos commits. Esto parece no hacer nada. –

+0

La secuencia de comandos anterior debe crear una nueva rama con solo una confirmación que contenga todos los archivos de la rama que el repositorio local tenía al principio. La última inserción anula la rama principal remota con la rama "one commit". Esto elimina todo el historial de la rama principal. Esto se puede utilizar para reducir el depósito después para ahorrar espacio y ancho de banda. Tal vez te equivocaste o le escribiste mal el paso "checkout git --orphan aplanado". – murraybo

+0

Creo que estoy confundido cuando esto se desarrolla localmente. Cavé un poco más después de dejar mi comentario y parece que esto aplana cosas en el servidor, pero si luego lo extraes de maestro a maestro localmente, obtienes ese 1 nuevo compromiso: tu historial local permanece sin agrupar, y ahora difiere marcadamente del servidor. . Para aplanarse en realidad parece que todos necesitarían clonar de nuevo, no tirar, lo que al menos necesita ser explicado claramente aquí, ya que es poco probable que sea lo que algunos pretendían cuando querían una historia aplanada. –

4

No estoy muy cómodo con hacer rebases, así que intente esto en un clon por separado para ver si funciona antes de hacerlo en su espacio de trabajo real.

Éstos son mis compromete

[email protected]% git log --pretty=oneline 
967122e7d4e687c0707d25c62cb0d3b6a45d337f Added h 
3b82cae737d5fb3317bc7a686a2fdf0fdd9d1c7e Added g 
94d89e0455b12e1e4843e64a8f62f3ad6cdf42f3 Added f 
a30321b7a367d9b7da6369783650acadbb773cfb Added e 
04453f1c90ffde0574c9c8a76f154d741d7d83f4 Added d 
ec723a3266e56cc39967bf117154465575905e31 Added c 
f415d1f58e2f7bd4beea80ab9acd8309bf5b64e7 Added b 
7f1f8d1f903168aa929818a0eb81e0ec7743fb85 Added a 
21790602bd6c0a009899ea33e64fec63559c0a76 Added it 

estoy rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 (Added d) en 21790602bd6c0a009899ea33e64fec63559c0a76 (el primer commit) y aplastar a todos y lo hago con este comando

git rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 --onto 21790602bd6c0a009899ea33e64fec63559c0a76 

Después de terminar esto, los registros se ven así

[email protected]% git log --pretty=oneline 
c76290666c8b868d36290d8f5276b879bb78d05d Added h 
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g 
051062042e56759d83258c5e90a9876aa6f52764 Added f 
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e 
21790602bd6c0a009899ea33e64fec63559c0a76 Added it 

Esto es lo que estás buscando?

+0

¿Qué versión de git usa usted? Obtuve: Uso: git rebase ... con la versión de Git 1.7.3.1.msysgit.0 – schoetbi

+0

Uso 'git versión 1.7.0.4' –

+0

Con la opción --root Obtuve el resultado; sin embargo, cuando finalizo el master, la historia anterior aparecer de nuevo. ¿Cómo puedo eliminarlo completamente de la historia? – schoetbi

4

squash el respectivo se compromete en uno usando git rebase --interactive.

+1

hay una manera de hacerlo, p. git rebase squash COLA: 58c5e9? – schoetbi

+0

Por lo que yo sé (y la documentación no parece indicar), no es posible. –

+1

¿Esto elimina git/objects? – williamcarswell

0

Esto puede parecer poco convencional, pero si no se preocupan por la historia, y el repositorio de tener solamente una sola rama y masterno han sido publicados a Github.com u otros sitios, se puede:

  1. Eliminar carpeta oculta .git en la raíz de la cesión temporal
  2. git init
  3. commit

Recuerde que el primer paso borrará todos los datos de git, incluyendo la bifurcación y la confirmación, así que tenga cuidado.

Cuestiones relacionadas