2010-07-25 14 views
5

Ahora tengo un gran repositorio de Git que hace ruido de bocina, hinchado y que consume mucho espacio en disco en GitHub que quiero poner a dieta. Necesito descartar los compromisos antiguos realizados al principio de la historia del proyecto que son esencialmente irrelevantes para la dirección actual del proyecto.git rebase. ¿Cómo lo uso para colapsar resmas de compromisos antiguos?

Soy y siempre seré el único usuario de este repositorio privado.

Lo ideal sería que pudiera hacer algo como:

git rebase de nacer de-repo-hasta-un mes de hace

Gracias,
Doug

+0

posible duplicado de [¿Cómo combino los primeros dos commits de un repositorio de Git?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Si bien la pregunta aquí enlazada explica cómo combinar solo dos commits, las recetas allí descritas también funcionan para más commits. –

+0

Gracias Pavel. Lo comprobaré. – dugla

+0

¿Desea aplastar todas esas confirmaciones en una confirmación o, en realidad, desea descartar los cambios que introdujo cada una? En base a sus comentarios que quiere "descartar" y el proyecto va en una dirección diferente, no está del todo claro para mí. – masonk

Respuesta

2

En realidad, voy a ir con aburrido viejo git rebase -i CABEZA ~ Número donde el número me llevará desde la cabeza hasta el compromiso inicial. Lleva más tiempo, pero al menos tengo una vaga comprensión de lo que está haciendo. Gracias por todas las sugerencias.

1

He aquí una receta que le trabajar en Git 1.7.2 o posterior:

 
start=$starting_sha1 
git checkout --orphan new_master $start 
git commit -m 'new root' 
git rebase --onto new_master $start master 
git checkout master 
git reset --hard new_master 
git push -f origin master 

la limpieza de los objetos antiguos que ya no se hace referencia es más trabajo, ya que c Ould ser apuntado por reflogs, escondite, etiquetas, otras ramas, etc. Una vez que estés seguro de que estos son fijos o retirados, uno o más de los siguientes deben ayudar:

 
git prune 
git gc 
git repack -ad 
7

La opción --squash a git merge puede haber útil, y está disponible en git 1.4.1 y posterior. Esto establece los efectos de una combinación, pero no crea una confirmación. Por lo tanto, si 143eff es la más antigua cometer desea incluir en el aplastado confirmación, su rama actual es master y el "un mes" comprometerse es dcb7e5, se podría hacer:

# Save the old position of "master" by creating a branch old-master: 
$ git checkout master 
$ git branch old-master 

# Create and checkout a branch called "new-master" that's at the old commit: 
$ git checkout -b new-master 143eff 

# Stage the effects of merging the "one month ago" commit: 
$ git merge --squash dcb7e5 
Updating 143eff3..dcb7e5b 
Fast-forward 
Squash commit -- not updating HEAD 
[... status output showing the staged changes ..] 

# Create the squashed commit: 
$ git commit -m "A commit squashing history up to a month ago" 
# (You could use --amend if you want them to be squashed into 143eff 
# instead of being a commit after that.) 

Ahora se puede comprobar con git diff dcb7e5 new-master que ellos realmente son lo mismo.

Luego, si desea que rebase el resto de su trabajo en nueva-master:

$ git rebase --onto new-master dcb7e5 master 

que va a dejar en un porcentualizada master que debe tener la historia que desea. la historia (Una vez más, se puede comprobar esto con git diff old-master master y git log Cuando empuje principal a github que tendrá que añadir --force desde que ha reescrito:.

# Push master to github, with "--force", since you've rewritten history: 
$ git push --force origin master 

Ahora puede quitar new-master, que está en la calabaza cometió, con:

git branch -d new-master 

Al parecer github corre git gc --auto en empujones, por lo que hay que ver algunos ahorro de espacio pronto ...

+0

Esto funcionó como un amuleto, ¡gracias Mark! – Itay