2011-09-15 14 views

Respuesta

59

La solución es simple:

git filter-branch [options] -- --all

Nota los cuatro guiones (dos conjuntos de guiones dobles con un espacio en el medio) en -- --all.

Si nos fijamos en la documentación para git-filter-branch, que dice lo siguiente:

git filter-branch [--env-filter <command>] [--tree-filter <command>] 
    [--index-filter <command>] [--parent-filter <command>] 
    [--msg-filter <command>] [--commit-filter <command>] 
    [--tag-name-filter <command>] [--subdirectory-filter <directory>] 
    [--prune-empty] 
    [--original <namespace>] [-d <directory>] [-f | --force] 
    [--] [<rev-list options>…] 

leyendo, el comienzo de la documentación dice: "Le permite reescribir la historia git revisión reescribiendo las ramas mencionadas en el < Opciones de lista de revisión >, aplicando filtros personalizados en cada revisión. "

lo que comprobar la documentación para rev-list da:

< opciones rev-list> ... Los argumentos para git rev-list. Se reescriben todas las referencias positivas incluidas en estas opciones. También puede especificar las opciones , como --todas, pero debe usar-- para separarlas de las opciones de git de la rama de filtro.

Y la documentación para git-rev-list dicen:

--all 
Pretend as if all the refs in refs/ are listed on the command line as <commit>. 
+10

solo para aclarar, normalmente 'filter-branch' aparece con' HEAD 'al final, '- --all' reemplaza a' HEAD' – EoghanM

+0

¿Cómo puedo hacer que funcione en PowerShell (Windows)? Sigue sacando el error y mostrando el mensaje de ayuda para 'filter-branch'. He intentado cambiar a comillas dobles según la respuesta de Pablo, pero no puedo evitar las comillas dobles (ver mis comentarios sobre la respuesta). – ADTC

+2

Resolví lo anterior mediante el uso de tuberías (en la función de PowerShell). Básicamente: 'git rev-list --all | git filter-branch [opciones] '(no rev-list al final) en lugar de' git filter-branch [opciones] - --all'. – ADTC

6

como la respuesta de @ ben-lee explica, --all se requiere para volver a escribir todas las ramas. Si tiene etiquetas en su repositorio, querrá limpiar todos esos, así como las ramas, para obtener los beneficios de la reducción de tamaño, y que requerirá un conjuro adicional --tag-name-filter cat.

Aunque la pregunta especifica usando git filter-branch, el interlocutor desea 'borrar algunos archivos de gran tamaño y los directorios de mi repositorio', por lo que es importante mencionar que la mejor herramienta por hacer eso es en realidad The BFG Repo Cleaner, un sencillo , alternativa más rápida a git filter-branch. Por ejemplo:

$ bfg --strip-blobs-bigger-than 10M 

... elimina todas las manchas más grandes que 10 MB (que no están en su última commit), y funciona en todos los ramas & etiquetas en tu repositorio.

Descripción completa: Soy el autor de BFG Repo-Cleaner.

+1

No hay problema @EoghanM: es posible que este video demo sea interesante: es una carrera entre git filter-branch y The BFG (que se ejecuta en una Raspberry Pi ...) http://www.youtube.com/watch?v=Ir4IHzPhJuI –

2

Seguí todas las instrucciones para hacer esto en mi cuadro de Windows, pero seguí recibiendo un error, hasta que dejé de usar comillas simples y usé comillas dobles en su lugar.

Mi motivación fue que revisé accidentalmente mi entorno vagrant. Aquí está el comando para eliminar la carpeta vagrant de todas las ramas:

git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all 

basta con sustituir vagrant con su nombre de directorio, y va a eliminar este directorio de todas las ramas.

+0

Tuve este problema. ¡Gracias! Además, si su comando contiene comillas dobles (como ''rm -rf' 'vagabundo"' '), escapelas usando dos comillas dobles (como' "rm -rf" "vagabundo" "" '). – ADTC

+0

En realidad, eso no funciona. Claro, eso funciona para PowerShell pero 'git' simplemente se equivoca. – ADTC

+0

Hay un 'git bash' en Windows por una razón. Úselo, tarde o temprano usando git de cmd te golpeará. – GiM

Cuestiones relacionadas