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 derm -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.
- Eliminar archivo del repositorio git (historial)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
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