Retire grande.pack archivo creado por git


He comprobado una carga de archivos en una rama y fusionado y luego tuvo que eliminarlos y ahora me quedo con un grande .paquete de archivo que no se cómo deshacerse de.

Eliminé todos los archivos usando git rm -rf xxxxxx y también ejecuté la opción --cached también.

Puede alguien decirme cómo puedo quitar un grande .archivo pack que se encuentra actualmente en el siguiente directorio:

.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack

¿Solo necesito eliminar la rama que todavía tengo pero que ya no uso? ¿O hay algo ¿si no tengo que correr?

No estoy seguro de cuánta diferencia hace pero muestra un candado contra el archivo.

Gracias


EDITAR

Aquí hay algunos extractos de mi bash_history que deberían dar una idea de cómo me las arreglé para llegar a este estado (supongamos que en este punto estoy trabajando en una rama de git llamada 'my-branch' y tengo una carpeta que contiene más carpetas/archivos):

git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/     (not sure why I ran this as well but I did)

Pensé que también ejecuté lo siguiente, pero no aparece en la historia de bash con el otros :

git rm -rf --cached unwanted_folder/

También pensé que ejecuté algunos comandos de git (como git gc) para tratar de ordenar el archivo pack, pero no aparecen en el .bash_history archivo.

Author: yunque, 2012-06-15

5 answers

El problema es que, aunque eliminó los archivos, todavía están presentes en revisiones anteriores. Ese es el punto de git, es que incluso si eliminas algo, aún puedes recuperarlo accediendo al historial.

Lo que está buscando hacer se llama reescribir la historia, e involucró el comando git filter-branch.

GitHub tiene una buena explicación del problema en su sitio. https://help.github.com/articles/remove-sensitive-data

Para responder a su pregunta más directamente, lo que básicamente necesita para ejecutar es este comando con unwanted_folename_or_folder reemplazado en consecuencia:

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folename_or_folder' --prune-empty

Esto eliminará todas las referencias a los archivos del historial activo del repositorio.

A continuación, para peform un ciclo de GC para forzar todas las referencias al archivo para ser expirado y purgado del packfile. Nada necesita ser reemplazado en estos comandos.

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --aggressive --prune=now
 125
Author: loganfsmyth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-13 15:06:56

Una opción:

Ejecute git gc manualmente para condensar un número de archivos pack en uno o varios archivos pack. Esta operación es persistente (es decir, el archivo de paquete grande conservará su comportamiento de compresión) por lo que puede ser beneficioso comprimir un repositorio periódicamente con git gc --aggressive

Otra opción es guardar el código y .git en algún lugar y luego eliminar el .git y empezar de nuevo usando este código existente, creando un nuevo repositorio git (git init).

 5
Author: Michael Durrant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-15 12:36:45

Escenario A: Si sus archivos grandes solo se agregaron a una rama, no necesita ejecutar git filter-branch. Solo necesita eliminar la rama y ejecutar la recolección de basura:

git branch -D mybranch
git reflog expire --expire-unreachable=all --all
git gc --prune=all

Escenario B : Sin embargo, parece basado en su historial de bash, que fusionó los cambios en master. Si no ha compartido los cambios con nadie (no git push todavía). Lo más fácil sería restablecer master de nuevo a antes de la fusión con la rama que tenía los archivos grandes. Esta voluntad elimina todas las confirmaciones de tu rama y todas las confirmaciones hechas en master después de la fusión. Así que usted podría perder los cambios addition además de los archivos grandes that que en realidad puede haber querido:

git checkout master
git log # Find the commit hash just before the merge
git reset --hard <commit hash>

Luego ejecute los pasos del escenario A.

Escenario C: Si hay otros cambios de la rama o cambios en master después de la fusión que desea mantener, lo mejor sería rebase master e incluir selectivamente confirmaciones que want:

git checkout master
git log # Find the commit hash just before the merge
git rebase -i <commit hash>

En su editor, elimine las líneas que corresponden a las confirmaciones que agregaron los archivos grandes, pero deje todo lo demás como está. Guardar y salir. Su rama maestra solo debe contener lo que desea, y no archivos grandes. Tenga en cuenta que git rebase sin -p eliminará las confirmaciones de fusión, por lo que se quedará con un historial lineal para master después de <commit hash>. Esto probablemente está bien para ti, pero si no, podrías intentarlo con -p, pero git help rebase dice combining -p with the -i option explicitly is generally not a good idea unless you know what you are doing.

Luego ejecute los comandos desde hipótesis A.

 4
Author: onlynone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-26 16:10:39

Como loganfsmyth ya indicó en su respuesta, necesita purgar el historial de git porque los archivos continúan existiendo allí incluso después de eliminarlos del repositorio. Los documentos oficiales de GitHub recomiendan BFG que encuentro más fácil de usar que filter-branch:

Eliminar archivos del historial

Descargar BFG desde su sitio web. Asegúrese de tener Java instalado, luego cree un clon de espejo y purgue el historial. Asegúrese de reemplazar YOUR_FILE_NAME con el nombre del archivo te gustaría borrar:

git clone --mirror git://example.com/some-big-repo.git
java -jar bfg.jar --delete-files YOUR_FILE_NAME some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

Eliminar una carpeta

Igual que el anterior pero use --delete-folders

java -jar bfg.jar --delete-folders YOUR_FOLDER_NAME some-big-repo.git

Otras opciones

BFG también permite opciones aún más elegantes (ver docs) como estas:

Eliminar todos los archivos mayores de 100M del historial:

java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git

¡Importante!

Al ejecutar BFG, tenga cuidado de que tanto YOUR_FILE_NAME como YOUR_FOLDER_NAME son solo nombres de archivos/carpetas. No son caminos, así que algo como foo/bar.jpg no funcionará! En su lugar, todos los archivos/carpetas con el nombre especificado se eliminarán del historial de repositorios, sin importar la ruta o rama que existieran.

 2
Author: Timo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 08:32:02

Llego un poco tarde al show, pero en caso de que la respuesta anterior no resolviera la consulta, encontré otra manera. Simplemente elimine el archivo grande específico de .paquete. Tuve este problema en el que me registré en un gran archivo de 2 GB accidentalmente. Seguí los pasos explicados en este enlace: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history /

 0
Author: Rishabh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-08 18:34:29