2011-11-28 15 views
7

Después de usar git gc y git repack (con varias opciones) todavía tengo 4825 suelta comete en la carpeta .git/objects. Me gustaría tener todos ellos en el archivo del paquete con el resto o en otro archivo del paquete.Git: cómo volver a embalar todos sueltos compromete

Estoy haciendo mucha reescritura de commit (modify + rebase) por lo tanto, es perfectamente normal tener muchas confirmaciones inalcanzables. Mi .gitconfig contiene estos parámetros para mantener los reflogs y las confirmaciones inalcanzables durante mucho tiempo.

[gc] 
    reflogExpire = 300 days 
    reflogExpireUnreachable = 200 days 
    pruneExpire = 90 days 

Usted puede preguntarse si tiene sentido pero ya necesita y se han recuperado unas cuantas confirmaciones hechas hace varios meses. Ocurre que desarrollamos durante muchos meses en un nuevo conjunto de ramas de mayor prioridad y luego continuamos en las ramas más antiguas de menor prioridad.

El motivo principal de esta pregunta es que git gui se sigue quejando para comprimir mi base de datos a pesar de que lo he hecho muchas veces. Si no podemos empaquetar esas confirmaciones sueltas, esta "queja" podría ser un error en git gui.

+0

wow, no tenía idea de que la gente realmente pueda trabajar con tantos commits flojos – prusswan

+0

dupe/related? http://stackoverflow.com/questions/3765234/listing-and-deleting-git-commits-that-are-under-no-branch-dangling – cregox

Respuesta

1

Teniendo en cuenta que git bundle se utiliza para trabajar solo con objetos de empaque (llamando al fetch-pack), ¿intentó to bundle y luego clona su repositorio?

git bundle create aBundle --all # hopefully package everything, 
           # the result being *one* file. 
git clone aBundle newRepo  # recreate a full repo 
# check if the cloned repo contains only packaged object 

Si esto funciona, puede continuar, utilizando el nuevo repositorio clonado como su repositorio principal.

+0

Me temo que esto no ayuda. Creé un paquete así y es de 60 MB. Sin embargo, mi paquete de archivos en .git/objects/pack es de 64 MB y todos los objetos sueltos objetos juntos toman 32 MB. Traté de hacer referencia a una confirmación pendiente (de mi repositorio) en el paquete pero no funcionó (¿alguien sabe cómo?). –

+1

@PaulPladijs: pero, ¿un clon de ese paquete contiene algún objeto desempaquetado? Sin embargo, estoy de acuerdo en que un paquete de git es probable que solo tenga en cuenta el compromiso referenciado. – VonC

1

La advertencia de git-gui es solo una sugerencia de que es posible que desee realizar algún tipo de mantenimiento. Para la mayoría de las personas que tienen una gran cantidad de objetos solo los está frenando. En su caso, debe desactivar la advertencia. La función en cuestión es hint_gc y se invoca desde cerca del final del archivo de script de git-gui. Simplemente coméntelo como a continuación.

if {[is_enabled multicommit]} { 
     #after 1000 hint_gc 
} 

El negocio multicommit es un indicador que determina si estamos funcionando como committool o una aplicación de propósito general.

Si desea utilizar git-gui normalmente en otro lugar, puede agregar un marcador específico de repositorio en su lugar. Algo así como:

if {[is_enabled multicommit] && ![is_config_true gui.skip_gc_warning]} { 
     after 1000 hint_gc 
} 

debe dejar de utilizar git config --bool gui.skip_gc_warning true desactivar que, en función de cada repositorio.

+0

¡Esta es una buena idea! Lo intenté pero debes quitar los guiones bajos '_' en' skip_gc_warning' para que funcione. Todavía estoy esperando una solución de reempaquetado (tengo curiosidad si es posible). De lo contrario, esta puede ser la mejor respuesta. –

Cuestiones relacionadas