2009-09-09 8 views
33

¿Cuál es la mejor forma de que git consuma menos espacio en disco?¿Hace que Git consuma menos espacio en disco?

Estoy usando git-gc en mis repositorios (lo que ayuda, especialmente si ha habido muchos commits desde que fue clonado) pero me gustaría sugerencias si hay algún otro comando para reducir el espacio de disco utilizado por git .

Gracias

+1

O desea control de versiones con historial completo o no. Una historia completa inevitablemente ocupará algo de espacio. – innaM

+0

Y además: ¿Qué es más barato que el almacenamiento en estos días? – innaM

+1

¿De cuánto espacio estamos hablando, de todos modos? – Rook

Respuesta

8

git-gc llama a muchos otros comandos que se usan para limpiar y comprimir el repositorio. Todo lo que puede hacer es borrar algunas ramas viejas que no se usaron.

Respuesta corta: No :-(

3

Git GC eliminar objetos no utilizados. Eso es todo lo que puedes hacer.

Podría considerar dividir sus repositorios si se vuelven demasiado grandes.

5

Cada repositorio de git contiene todo el historial. Mientras que Git hace un buen trabajo al comprimir esto, simplemente hay muchos datos allí.

La solución "obvia" pero potencialmente imposible para usted es iniciar un nuevo repositorio sin todo ese historial antiguo.

1

Puede rehacer su repositorio Sin embargo creo que es llamado por git gc

git RePack -ad

18

Dependiendo de lo que quiere hacer con su repositorio. , también puede considerar el uso de la siguiente opción git clone:

--depth <depth> 
     Create a shallow clone with a history truncated to the specified 
     number of revisions. A shallow repository has a number of 
     limitations (you cannot clone or fetch from it, nor push from nor 
     into it), but is adequate if you are only interested in the recent 
     history of a large project with a long history, and would want to 
     send in fixes as patches. 
+1

Parece que después de git 1.9 clones superficiales permiten un poco más de interacción. una solución MEJOR se describe en esta respuesta SO usando replace http://stackoverflow.com/a/17622991/25286 – GDmac

1

git prune migh ser una pista. limpia el repositorio desde compromete inalcanzables (git gc no lo llama)

+1

De la página de manual de git-prune: "En la mayoría de los casos, los usuarios deben ejecutar git-gc, que llama a git-prune " – mipadi

+0

bueno, para mí, mis repositorios git se vuelven más pequeños en unos pocos mb al llamar a 'git prune' después de' git gc' (medido con du -sh .git). tal vez 'git gc' solo pode las confirmaciones más antiguas, y' git prune' poda cada objeto que no es alcanzable – knittl

+0

IIRC 'git gc' ofrece cierta seguridad adicional (sin eliminar algunos objetos) que carece' git prune'. –

42

Hay algunas sugerencias que puedo ofrecer:

  1. Eliminar las ramas ya no se utilizan. Pueden anotar algunas confirmaciones que no usas y que nunca usarías. Sin embargo, tenga cuidado de no eliminar las ramas que luego necesitaría (tal vez para revisarlas, o para comparar el esfuerzo fallido). Copia de seguridad primero.

  2. Compruebe si no ha confirmado algún archivo binario grande (quizás algún archivo generado) por error. Si lo tiene, puede purgarlo del historial usando "git filter-branch" ... bueno, si no compartió el repositorio, o si vale la pena agravar a otros colaboradores para reescribir el historial. Nuevamente: copia de seguridad primero.

  3. Puede podar más agresivamente, descartando algunas seguridades, bu usando git gc --prune=now, o git prune de bajo nivel. Pero tenga cuidado de no eliminar los dispositivos de seguridad y las copias de seguridad (como el reflog) que necesita minutos después de la compactación.

  4. Quizás lo que amplía su repositorio son algunos archivos sin seguimiento en el directorio de trabajo. Allí "make clean" o "git clean" pueden ser de ayuda (pero ten cuidado de no eliminar algunos archivos importantes).

  5. más segura de todas esas sugerencias: se puede tratar de acumular más y más agresiva, utilizando --depth y --window opción de bajo nivel git-repack. Véase también la publicación del blog Git Repack Parameters de Pieter de Bie en su blog DVCS Comparison, del 6 de junio de 2008. O "git gc --aggressive".

+1

Hombre, muchas gracias por --prune ** = now **! – Rageous

+1

Esto no es suficiente; hay más lugares de los que pueden surgir referencias que impiden que git gc recolecte cosas. Ver mi publicación http://antilamer.livejournal.com/443564.html – jkff

3

Git clon tiene ahora una opción --single-rama que le permite retirar una sola rama sin tirar de la historia git de las otras ramas. Si git está consumiendo mucho espacio en disco porque tiene muchas ramas, puede eliminar su pago actual y volver a clonar el repositorio utilizando esta opción para recuperar algo de espacio en disco. Por ejemplo:

cd ../ 
rm -rf ./project 
git clone -b master --single-branch [email protected]:username/project.git 

Además, si su maestro actual tiene una larga historia y que no tiene ningún ramas pendientes que deben fusionarse de nuevo en maestro, puede crear una rama de archivo fuera de amo y crear una nuevo maestro huérfano sin antecedentes git:

git checkout -b master_archive_07162013 # create and switch to the archive branch 
git push origin master_archive_07162013 # push the archive branch to the remote and track it 
git branch -D master      # delete local master 
git push --delete origin master   # delete remote master 
git remote prune origin     # delete the remote tracking branch 
git checkout --orphan master    # create a new master branch with no history 
git commit -m "initial commit"   # re-establish the files in the repo 
git push origin master     # push the new master to the remote 

el nuevo árbol de rama principal no estará relacionada con la edad rama principal archivado, por lo que sólo puede hacer esto cuando usted está realmente archivando la rama.

Si archiva su sucursal principal y luego git clone master con una sola sucursal, su salida debe ser mucho más pequeña.

-1

Es posible que tenga muchos proyectos de git clonados en su computadora, pero solo algunos de ellos están trabajando activamente en la actualidad.

En esos proyectos inactivos, los archivos de trabajo extraídos pueden consumir una cantidad significativa de espacio en disco. (A veces, incluso más grande que la historia de Git, porque la historia se comprime.)

  • Así que una manera de ahorrar espacio en disco es eliminar los archivos de trabajo de los proyectos de inactividad no está trabajando. Una buena forma de hacerlo es create an empty branch, que puede cambiar cuando no esté trabajando en el proyecto.

  • Otra cosa más drástica que puede hacer es eliminar absolutamente todo excepto el archivo .git/config. O simplemente eliminar la carpeta más grande, la historia git:

    rm -rf .git/objects 
    

    que le permitirá a git fetch nuevo en el futuro, cuando se desea que la historia y los archivos de nuevo. Antes de hacer esto, debe asegurarse que tiene empujó todo su trabajo (incluidas las sucursales locales) al repositorio remoto, por lo que no hay nada en el repositorio local de git que deba conservar.

1

Si no necesita mantener toda la historia comprometerse a nivel local, se puede utilizar un clon sin profundidad:

git clone --depth=1 [url_of_repo] 

frecuencia utilizo este cuando se clona proyectos de GitHub, si estoy interesado sólo en el último conjunto de archivos y no en la historia.

Aparentemente, recuperar y empujar es/no era compatible con clones poco profundos, pero he podido insertar y mover con éxito los cambios a los reposs de github, por lo que también podría funcionar en su caso.(Pero sin duda se encontrará con dificultades si desea fusionar ramas pero no tiene la base comprometida en la historia.)

Creo que es más fácil comenzar con un clon nuevo como se muestra arriba, pero otros han demostrado how to trim an existing local repo.

+0

... o esperar ... "no se puede clonar ni buscar de ella, ni presionar desde adentro" ... eso es un fastidio – tobixen

0

Método a prueba de tontos si no le importa el tamaño de descarga es eliminar el repositorio (puede simplemente eliminar toda la carpeta) y agregarlo nuevamente. ¡Asegúrate de que todo lo que se deba preservar se envíe al servidor!

Cuestiones relacionadas