ver tipos tag modificados log etiquetas eliminar crear archivos git github rebase git-rebase

tipos - git ver archivos modificados



Elimina la carpeta y su contenido del historial de git/GitHub (6)

Además de la popular respuesta above me gustaría agregar algunas notas para los sistemas de Windows . El comando

git filter-branch --tree-filter ''rm -rf node_modules'' --prune-empty HEAD

  • Funciona perfectamente sin ninguna modificación! Por lo tanto, no debe usar Remove-Item , del o cualquier otra cosa en lugar de rm -rf .

  • Si necesita especificar una ruta a un archivo o directorio, use barras inclinadas como ./path/to/node_modules

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 carpeta node_modules
  • Agregué esa carpeta al repositorio git y empujé el código a github (no estaba pensando en la parte npm en ese momento)
  • Comprendió que realmente no necesita esa carpeta para ser parte del código
  • Borré esa carpeta, la empujé.

En ese caso, el tamaño del repositorio total de git fue de alrededor de 6 MB, donde el código real (todos excepto esa carpeta) fue de alrededor de 300 KB .

Ahora, lo que estoy buscando al final es una forma de deshacerse de los detalles de esa carpeta de paquetes del historial de git para que, si alguien la clona, ​​no tengan que descargar el historial de 6 MB que contiene los únicos archivos reales que obtendrán. a partir de la última confirmación sería 300KB.

Busqué posibles soluciones para esto y probé estos 2 métodos.

El Gist parecía que funcionaba cuando, después de ejecutar el script, mostró que se deshizo de esa carpeta y luego mostró que se modificaron 50 confirmaciones diferentes. Pero no me dejó empujar ese código. Cuando intenté empujarlo, dijo que Branch up to date pero mostró que se habían modificado 50 confirmaciones en un git status . Los otros 2 métodos tampoco ayudaron.

Ahora, aunque mostró que eliminó el historial de esa carpeta, cuando verifiqué el tamaño de ese repositorio en mi localhost, aún quedaba alrededor de 6 MB. (También eliminé la carpeta refs/original pero no vi el cambio en el tamaño del repositorio).

Lo que quiero aclarar es si hay una manera de eliminar no solo el historial de confirmaciones (que es lo único que creo que sucedió) sino también esos archivos que Git está asumiendo, 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, retroceder a la primera confirmación realizar el truco y presionarlo (o eso significa que git lo hará?) ¿Aún tienes un historial de todos esos compromisos? (también conocido como 6MB).

Mi objetivo final aquí es, básicamente, encontrar la mejor manera de deshacerse del contenido de la carpeta de git para que un usuario no tenga que descargar 6MB de material y aún así posiblemente tenga los demás confirmaciones que nunca tocaron la carpeta de módulos (eso es bastante mucho todos ellos) en la historia de git.

¿Cómo puedo hacer esto?


Complete la receta de copiar y pegar, solo agregando los comandos en los comentarios (para la solución de copiar y pegar), después de probarlos:

git filter-branch --tree-filter ''rm -rf node_modules'' --prune-empty HEAD echo node_modules/ >> .gitignore git add .gitignore git commit -m ''Removing node_modules from git history'' git gc git push origin master --force

Después de esto, puede eliminar la línea "node_modules /" de .gitignore


El mejor y más preciso método que encontré fue descargar el archivo bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/

A continuación, ejecute los comandos:

git clone --bare https://project/repository project-repository cd project-repository java -jar bfg.jar --delete-folders node_modules git reflog expire --expire=now --all && git gc --prune=now --aggressive git push --mirror https://project/new-repository

Si desea eliminar archivos, use la opción de eliminar archivos en su lugar:

java -jar bfg.jar --delete-files *.pyc


Me parece que la opción --tree-filter usada en otras respuestas puede ser muy lenta, especialmente en repositorios más grandes con muchas confirmaciones.

Aquí está el método que utilizo para eliminar completamente un directorio del historial de git usando la opción --index-filter , que se ejecuta mucho más rápido:

# Make a fresh clone of YOUR_REPO git clone YOUR_REPO cd YOUR_REPO # Create tracking branches of all branches for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done # Remove DIRECTORY_NAME from all commits, then remove the refs to the old commits # (repeat these two commands for as many directories that you want to remove) git filter-branch --index-filter ''git rm -rf --cached --ignore-unmatch DIRECTORY_NAME/'' --prune-empty --tag-name-filter cat -- --all git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d # Ensure all old refs are fully removed rm -Rf .git/logs .git/refs/original # Perform a garbage collection to remove commits with no refs git gc --prune=all --aggressive # Force push all branches to overwrite their history # (use with caution!) git push origin --all --force git push origin --tags --force

Puede verificar el tamaño del repositorio antes y después del gc con:

git count-objects -vH


Quité las carpetas bin y obj de proyectos antiguos de C # usando git en windows. Ten cuidado con

git filter-branch --tree-filter "rm -rf bin" --prune-empty HEAD

Destruye la integridad de la instalación de git al eliminar la carpeta usr / bin en la carpeta de instalación de git.


Si estás aquí para copiar y pegar el código:

Este es un ejemplo que elimina node_modules de la historia

git filter-branch --tree-filter ''rm -rf node_modules'' --prune-empty HEAD git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d echo node_modules/ >> .gitignore git add .gitignore git commit -m ''Removing node_modules from git history'' git gc git push origin master --force