¿Cómo desactivo git-lfs?

6 minutos de lectura

avatar de usuario
Sombra

Tengo un repositorio en bitbucket que usa LFS. Desde que lo usé durante algún tiempo, decidí mover el repositorio nuevamente a un espacio bajo mi control. La única razón por la que usé LFS en primer lugar fue para duplicar efectivamente el límite de tamaño de mi repositorio (ya que los archivos en LFS van en un cubo separado), pero ahora lo estoy moviendo, ya no necesito hacer esto.

Necesito una forma de rastrear todo el historial de git, eliminando todos los rastros del trabajo que hace git LFS (para que todos los archivos se confirmen ‘normalmente’). Una vez hecho esto, tengo la intención de forzar el envío al nuevo repositorio.

He hecho un poco de búsqueda, y encontré Las soluciones sugeridas pero no entiendo cómo implementarlos/ejecutarlos porque son de alto nivel.

¿Cómo me despido de git LFS?

avatar de usuario
Sombra

Actualizar solo la confirmación actual

Si desea salir de LFS, pero no está tan preocupado por arreglar todo el historial de git, puede hacer lo siguiente;

git lfs uninstall
touch **/*
git commit -a

Esto desinstalará el soporte de LFS, tocará cada archivo (para que git reconozca que ha cambiado) y luego confirmará todos. Si lo desea, podría ser más específico (es decir, **/*.png por ejemplo). Tenga en cuenta que usando ** requiere soporte global extendido habilitado (shopt -s globstar en bash)

Actualizar todo el historial

Esto funcionó para mí, pero arroja muchos errores (yo pensar Recibo un error por cada confirmación en la que no se ha agregado un archivo a LFS) y lleva mucho tiempo (aproximadamente 2-3 segundos por confirmación).

git lfs uninstall
git filter-branch -f --prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | git add
' --tag-name-filter cat -- --all

Desinstala el soporte de git LFS (teóricamente evita que LFS altere el índice) y luego, para cada confirmación, se asegura de que los archivos LFS estén desprotegidos correctamente, luego los toca a todos (para que git se dé cuenta de que han cambiado), elimina la configuración de LFS que se encuentra en .gitattributes para que al clonarlo no siga intentando usar LFS, luego agrega el archivo real al index.

Después de hacer lo anterior, necesitará hacer un empujón forzado. Naturalmente, eso arrojará a cualquier otra persona que trabaje en su repositorio a un estado de cabeza desconectado, por lo que es prudente hacer esto durante un congelamiento de código. Luego, probablemente sea más fácil hacer que todos hagan un clon nuevo.

  • Recibo este error en Windows, incluso cuando uso git para Windows: cut’ no se reconoce como un comando interno o externo, un programa operable o un archivo por lotes.

    – BikerDude

    15 abr a las 16:49

  • @BikerDude sí, cortar es un comando de Linux. Podrías usar algo como cygwin.

    – Sombra

    16 abr a las 21:22

avatar de usuario
doug richardson

git lfs migrate export

De git lfs migrate help:

Exportar

los exportar mode migra los archivos punteros de Git LFS presentes en el historial de Git fuera de Git LFS, convirtiéndolos en sus correspondientes archivos de objetos.

Ejemplo de flujo de trabajo

  1. Verifique que realmente tenga archivos LFS con git lfs ls-files.
  2. Eliminar todo filter=lfs líneas de TODOS los .gitattributes archivos en su repositorio. .gitattributes puede vivir en cualquier lugar, así que asegúrese de encontrarlos a todos; de lo contrario, esto puede causar problemas de migración más adelante.
  3. Confirme cualquier cambio que haya realizado en .gitattributes.
  4. Asegúrese de no tener cambios con git status.
  5. Ejecute la migración: git lfs migrate export --everything --include .
  6. Correr git status para asegurarse de que no tiene cambios. si te fuiste .gitattributes con filter=lfs es posible que tenga cambios incorrectos ahora.
  7. Verifique que todos los archivos LFS enumerados anteriormente ya no estén presentes con git lfs ls-files.
  8. Inspeccione los archivos (por ejemplo, abra los archivos LFS anteriores para asegurarse de que no estén dañados) y ejecute su compilación para asegurarse de que todo funcione.

Puntas

  • Ejecutar en un sistema de archivos que distingue entre mayúsculas y minúsculas, en caso de que tenga colisiones en el sistema de archivos (p. ej., ./LICENSE y ./License) en algún momento.
  • Deshazte de todos tus filter=lfs líneas de TODOS tus .gitattributes.
  • También es posible que desee eliminar los restos de LFS en .git/hooks directorio: pre-compromiso, post-compromiso, post-pago, post-fusión.
  • Con $GIT_TRACE=1 no debe haber ninguna señal de ...trace git-lfs: filepathfilter: accepting...

  • También es posible que desee eliminar los restos de LFS en .git/hooks directorio: pre-commit, post-commit, post-checkout, post-merge. Con $GIT_TRACE=1 no debe haber ninguna señal de ...trace git-lfs: filepathfilter: accepting...

    – pizycki

    29 de noviembre de 2019 a las 14:17


  • @pizycki Gracias. Agregué sus comentarios a la respuesta.

    –Doug Richardson

    2 de diciembre de 2019 a las 0:03

  • Así que esto fue increíble. Funcionó maravillosamente, mientras que las instrucciones simples proporcionadas en los documentos reales de git lfs … no tanto. ¿Puedes explicar por qué el punto después de –include? Siempre pensé que esto tenía que ser alguna expresión, pero cuando usé esencialmente lo que estaba en mis .gitattributes, no funcionó ni mucho menos.

    – jkratz

    12 abr 2020 a las 20:26

  • @jkratz Es un idiota <pathspec>. Tenga en cuenta que el <pathspec> Usé solo funciona si estás en el directorio de nivel superior en tu pago de git. Si desea poder ejecutar el comando desde cualquier lugar como pretendía, puede usar :/: en cambio. Correr git ls-files <pathspec> para ver cómo funciona. git-scm.com/docs/gitglossary#Documentación/…

    –Doug Richardson

    12 abr 2020 a las 20:52


  • ¿Qué debe hacer si (por ejemplo, en Github Desktop) dice que su local es diferente del remoto en todas las confirmaciones? ¿Debo tratar el repositorio exportado como uno completamente nuevo?

    –Tom Charles Zhang

    17 de febrero a las 7:33


Para un archivo en particular

  1. Eliminar archivo/patrón de .gitattributes
  2. Ir al directorio de archivos y ejecutar touch myfile.bin
  3. Confirmar y enviar cambios

avatar de usuario
arapEST

Basado en la respuesta de Shadow, modifiqué un poco toda la actualización del historial. Para aquellos que no quieren guardar archivos LFS (que en mi caso no lo hice, porque habrían sido enormes).

Usar:

GIT_LFS_SKIP_SMUDGE=1 git filter-branch -f --prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs rm -f
  git rm -f --ignore-unmatch .gitattributes
' --tag-name-filter cat -- --all

Además no falla cuando no .gitattributes está presente en una confirmación, lo que nuevamente, en mi caso, no fue cierto para todas las confirmaciones.

Además, el repositorio no tenía los archivos LFS originales almacenados en remoto, por lo tanto, el uso de GIT_LFS_SKIP_SMUDGE=1

De esta manera, el repositorio no incluye referencias ni archivos LFS, lo que hace que la clonación del repositorio sea más rápida y liviana, que era mi objetivo. De todos modos, se usaron archivos grandes para las pruebas, pero dado que el código ha mejorado mucho, ejecutar esas pruebas antiguas es irrelevante.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad