Estaba trabajando en un repositorio en mi cuenta de GitHub y este es un problema con el que me topé.
- Proyecto Node.js con una carpeta con algunos paquetes npm instalados
- Los paquetes estaban en la
node_modules
carpeta - Agregó esa carpeta al repositorio de git y empujó el código a github (no estaba pensando en la parte npm en ese momento)
- Me di cuenta de que realmente no necesitas esa carpeta para ser parte del código
- Eliminé esa carpeta, la empujé
En ese caso, el tamaño del repositorio total de git era de alrededor de 6 MB, donde el código real (todo excepto esa carpeta) era de solo alrededor de 300 KB .
Ahora, lo que estoy buscando al final es una forma de deshacerme de los detalles de esa carpeta del paquete del historial de git, por lo que si alguien lo clona, no tienen que descargar un historial de 6 MB donde solo obtendrán los archivos reales. a partir de la última confirmación sería de 300 KB.
Busqué posibles soluciones para esto y probé estos 2 métodos
- Eliminar archivo del repositorio de git (historial)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
Gist parecía que funcionaba donde, después de ejecutar el script, mostraba que se había deshecho de esa carpeta y luego mostraba que se habían modificado 50 commits diferentes. Pero no me dejó empujar ese código. Cuando traté de presionarlo, dijo Branch up to date
pero mostró que 50 commits fueron modificados en a git status
. Los otros 2 métodos tampoco ayudaron.
Ahora, aunque demostró que se deshizo del historial de esa carpeta, cuando verifiqué el tamaño de ese repositorio en mi localhost, todavía era de alrededor de 6 MB. (También eliminé la refs/original
carpeta pero no vi el cambio en el tamaño del repositorio).
Lo que quiero aclarar es, si hay una manera de deshacerse no solo del historial de confirmaciones (que es lo único que creo que sucedió) sino también de esos archivos que git sigue asumiendo que uno quiere revertir.
Digamos que se presenta una solución para esto y se aplica en mi host local, pero no se puede reproducir en ese repositorio de GitHub, ¿es posible clonar ese repositorio? ¿Todavía tienes un historial de todos esos commits?
Mi objetivo final aquí es básicamente encontrar la mejor manera de deshacerme del contenido de la carpeta de git para que un usuario no tenga que descargar cosas por valor de 6MB y aún así posiblemente tenga los otros commits que nunca tocaron la carpeta de módulos (eso es bastante mucho todos ellos) en la historia de git.
¿Cómo puedo hacer esto?
fuente
Respuestas:
Si está aquí para copiar y pegar código:
Este es un ejemplo que elimina
node_modules
del historialLo que realmente hace git:
La primera línea itera a través de todas las referencias en el mismo árbol (
--tree-filter
) que HEAD (su rama actual), ejecutando el comandorm -rf node_modules
. Este comando elimina la carpeta node_modules (-r
, sin-r
,rm
no eliminará carpetas), sin que se indique al usuario (-f
). Los--prune-empty
borrados añadidos se comprometen inútilmente (sin cambiar nada) de forma recursiva.La segunda línea elimina la referencia a esa antigua rama.
El resto de los comandos son relativamente sencillos.
fuente
git count-objects -v
verificar si los archivos se eliminaron realmente, pero el tamaño del repositorio sigue siendo el mismo hasta que cloné el repositorio nuevamente. Git mantiene una copia de todos los archivos originales, creo.--force-with-lease
, no--force
.Encuentro que la
--tree-filter
opción utilizada en otras respuestas puede ser muy lenta, especialmente en repositorios más grandes con muchas confirmaciones.Aquí está el método que uso para eliminar completamente un directorio del historial de git usando la
--index-filter
opción, que se ejecuta mucho más rápido:Puede verificar el tamaño del repositorio antes y después del
gc
con:fuente
--quiet
a logit rm
anterior aceleró mi reescritura al menos por el factor 4.Además de la respuesta popular anterior, me gustaría agregar algunas notas para los sistemas Windows . El comando
funciona perfectamente sin ninguna modificación! Por lo tanto, no debe usar
Remove-Item
,del
ni nada más en lugar derm -rf
.Si necesita especificar una ruta a un archivo o directorio, utilice barras como
./path/to/node_modules
fuente
El método mejor y más preciso que encontré fue descargar el archivo bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
Luego ejecuta los comandos:
Si desea eliminar archivos, use la opción eliminar archivos en su lugar:
fuente
Parece que la respuesta actualizada a esto es no usar
filter-branch
directamente (al menos git en sí mismo ya no lo recomienda) y diferir ese trabajo a una herramienta externa. En particular, actualmente se recomienda git-filter-repo . El autor de esa herramienta proporciona argumentos sobre por qué usarfilter-branch
directamente puede generar problemas.La mayoría de los scripts de varias líneas anteriores para eliminar
dir
del historial podrían reescribirse como:La herramienta es más poderosa que solo eso, aparentemente. Puede aplicar filtros por autor, correo electrónico, nombre de referencia y más (página de manual completa aquí ). Además, es rápido . La instalación es fácil: se distribuye en una variedad de formatos .
fuente
pip3 install git-filter-repo
hacerlo ya que es solo stdlib y no instala ninguna dependencia. En Ubuntu 18 es incompatible con la versión git de distroError: need a version of git whose diff-tree command has the --combined-all-paths option
, pero es bastante fácil ejecutarlo en undocker run -ti ubuntu:20.04
Complete la receta de copiar y pegar, simplemente agregue los comandos en los comentarios (para la solución de copiar y pegar), después de probarlos:
Después de esto, puede eliminar la línea "node_modules /" de .gitignore
fuente
node_modules
de.gitignore
? ¿Para que puedan ser cometidos accidentalmente de nuevo?node_modules
de.gitignore
.Para usuarios de Windows, tenga en cuenta el uso en
"
lugar de'
También se agrega-f
para forzar el comando si ya hay otra copia de seguridad allí.fuente
Eliminé las carpetas bin y obj de antiguos proyectos de C # usando git en windows. Ten cuidado con
Destruye la integridad de la instalación de git eliminando la carpeta usr / bin en la carpeta de instalación de git.
fuente