Nombre de archivo demasiado largo en Git para Windows

665

Estoy usando Git-1.9.0-preview20140217para Windows. Como sé, esta versión debería solucionar el problema con nombres de archivo demasiado largos. Pero no para mí.

Ciertamente yo estoy haciendo algo mal: lo hice git config core.longpaths truey git add .ya continuación git commit. Todo salió bien. Pero cuando ahora hago un git status, obtengo una lista de archivos con Filename too long, por ejemplo:

node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js: Filename too long

Para mí es bastante simple de reproducir: simplemente cree una aplicación web Yeoman con el generador Angular ("yo angular") y elimínela node_modulesdel .gitignorearchivo. Luego repita los comandos Git mencionados anteriormente.

¿Que me estoy perdiendo aqui?

Papa Mufflon
fuente
¿Dónde lees que esa versión debería corregir los nombres largos de archivo?
iveqy
Aquí está la solicitud de extracción para el parche: github.com/msysgit/git/pull/122
Papa Mufflon
@PapaMufflon ¿puedes cambiar la respuesta aceptada a la que tiene más puntaje? Simplemente me ayudó mucho.
v.karbovnichy
@ v.karbovnichy por favor lea mi pregunta cuidadosamente. Ya ejecuté el comando en la respuesta más votada. Pero cuando hice la pregunta, la respuesta aceptada era correcta: msys todavía tenía esta limitación de caracteres. Ahora esa limitación se ha ido y git config core.longpaths true funciona como debería.
Papa Mufflon el
Ok, acepto entonces
v.karbovnichy

Respuestas:

707

Git tiene un límite de 4096 caracteres para un nombre de archivo, excepto en Windows cuando Git se compila con msys. Utiliza una versión anterior de la API de Windows y hay un límite de 260 caracteres para un nombre de archivo.

Por lo que yo entiendo, es una limitación de msys y no de Git. Puede leer los detalles aquí: https://github.com/msysgit/git/pull/110

Puede evitar esta utilizando otro cliente Git en Windows o conjunto core.longpathsa truecomo se ha explicado en otras respuestas.

git config --system core.longpaths true

Git se construye como una combinación de scripts y código compilado. Con el cambio anterior, algunos de los scripts pueden fallar. Esa es la razón por la cual core.longpaths no está habilitado de forma predeterminada.

La documentación de Windows en https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file tiene más información:

A partir de Windows 10, versión 1607, las limitaciones de MAX_PATH se han eliminado de las funciones comunes de archivos y directorios de Win32. Sin embargo, debe optar por el nuevo comportamiento.

Una clave de registro le permite habilitar o deshabilitar el nuevo comportamiento de ruta larga. Para habilitar el comportamiento de ruta larga, configure la clave de registro en HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled (Tipo: REG_DWORD)

iveqy
fuente
19
La limitación a 260 caracteres en una ruta no es específica de MSYS, es una imitación general de la API de Windows. Esto se puede solucionar mediante el uso de rutas Unicode, pero eso tiene otros inconvenientes, por core.longpathslo que no está habilitado de forma predeterminada. También tenga en cuenta que Git para Windows no se compiló contra MSYS. En cambio, es una aplicación nativa de Windows que viene con un entorno MSYS simplificado.
sschuberth
3
@sschuberth: ¿Existen otros inconvenientes además de la falta de compatibilidad con programas que no admiten rutas largas?
JAB
3
@JAB Otro inconveniente es que las rutas largas siempre tienen que ser absolutas; Las rutas relativas no son compatibles. Para más detalles, consulte aquí .
sschuberth
44
O como una solución rápida, simplemente intente verificar su repositorio en C: / en Windows para reducir el número de caracteres de ruta de carpeta.
Akshay Lokur
55
Para su información, en este momento el problema aún persiste. Es posible que deseemos considerar el desarrollo continuo en un sistema operativo real ...
Géza Török
1035

Deberías poder ejecutar el comando

git config --system core.longpaths true

o agréguelo a uno de sus archivos de configuración de Git manualmente para activar esta funcionalidad, una vez que esté en una versión compatible de Git. Parece que tal vez 1.9.0 y posteriores.

sparkym3
fuente
13
Esta opción de configuración solucionó el problema para mí, incluso con msys como se menciona en la respuesta aceptada. (Específicamente, versión 1.9.4.msysgit.2).
Alex Osborn
55
Sourcetree actúa un poco raro a menos que "también se asegure de que SourceTree esté usando el Git del sistema y no el incrustado". - Gracias a Matej Drolc por ese consejo
bstoney
38
Aquí hay información básica sobre por qué esto no está habilitado de manera predeterminada y algunos detalles técnicos.
sschuberth
12
get "no pudo bloquear el archivo de configuración C: \ Archivos de programa \ Git \ mingw64 / etc / gitconfig" después de ejecutar el comando anterior. Pero la respuesta @Yash funcionó para mí
divideByZero
10
@divideByZero ejecutando git bash como administrador evita ese error.
Niek
205

Esto podría ayudar:

git config core.longpaths true

Explicación básica: esta respuesta sugiere que no se aplique dicha configuración al sistema global (a todos los proyectos para evitar --systemo --globaletiquetar) configuraciones. Este comando solo resuelve el problema al ser específico para el proyecto actual.

Sagiruddin Mondal
fuente
13
La gente aquí ha notado que esta configuración puede introducir un comportamiento impredecible, por lo que parece preferible usar el comando anterior como una configuración local en proyectos donde eso lo requiere en lugar de agregar lo --systemque se aplicará a todos los proyectos
Grant Humphries
44
oye, eso es solo una copia de la otra respuesta altamente votada. al menos podría explicar por qué prefiere eliminar la opción --sistema ..
Félix Gagnon-Grenier
79

Crea .gitconfig y agrega

[core]
longpaths = true

Puede crear el archivo en la ubicación de un proyecto (no estoy seguro) y también en la ubicación global. En mi caso la ubicación es C:\Users\{name}\.

Yash
fuente
10
También puede hacer esto con el siguiente comando:git config --global core.longpaths true
Curly
git config --global core.longpaths true funcionó para mí gracias
Rama Krshna Ila
1
Usando Visual Studio, las soluciones de git bash anteriores no funcionaron para mí, pero encontrar el archivo .git / config para el proyecto y editarlo como se muestra arriba sí lo hizo. Gracias yash.
Andrew Paté
esto funcionó para mí,
localicé
1
Las respuestas verificadas y mencionadas anteriormente son correctas, pero con los permisos otorgados al archivo, es posible que no sea posible actualizar el archivo con esos comandos. Este enfoque es realmente fácil porque este es el enfoque manual y me funcionó muy bien. Puede encontrar fácilmente el .gitconfigarchivo en la siguiente ruta C:\Users\{username}y simplemente editarlo.
Kavindu Narathota
53

Pasos a seguir:

  1. Ejecute Git Bash como administrador
  2. Ejecute el siguiente comando:
git config --system core.longpaths true

Nota : si el paso 2 no funciona o da algún error, también puede intentar ejecutar este comando:

git config --global core.longpaths true

Lea más sobre git config aquí .

Saikat
fuente
35

La mejor solución es habilitar el parámetro longpath de Git.

git config --system core.longpaths true

Pero una solución alternativa que funciona es eliminar la carpeta node_modules de Git:

$ git rm -r --cached node_modules
$ vi .gitignore

Agregue node_modules en una nueva fila dentro del archivo .gitignore. Después de hacer esto, empuje sus modificaciones:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push
Janderson Silva
fuente
3
Hay una buena razón para mantener la carpeta node_modules registrada en git: si desea que su software se comporte igual después de un año de módulos que posiblemente desaparezcan de npm.
cfstras
@cfstras si alguna biblioteca tiene una vulnerabilidad y no se actualiza periódicamente, ciertamente tendrá problemas de seguridad.
Janderson Silva el
1
Por supuesto, debe actualizar sus dependencias. Pero sólo cuando se desee, y si algo fuera a romper, que quiere que su copia de seguridad en git ...
cfstras
Es verdad. Editaré mi respuesta. Gracias por tu comentario.
Janderson Silva
1
No es necesario comprometerse node_modules: el packages.lockarchivo está aquí para garantizar que la versión instalada por npm installsea ​​siempre la misma, hasta que realice unnpm update
Pierre-Olivier Vares
32

Para estar completamente seguro de que surte efecto inmediatamente después de que se inicialice el repositorio, pero antes de recuperar el historial remoto o retirar cualquier archivo, es más seguro usarlo de esta manera:

git clone -c core.longpaths=true <repo-url>

-c clave = valor

Establecer una variable de configuración en el repositorio recién creado; esto surte efecto inmediatamente después de que se inicialice el repositorio, pero antes de que se recupere el historial remoto o se desproteja cualquier archivo. La clave está en el mismo formato esperado por git-config 1 (p. Ej., Core.eol = true). Si se dan varios valores para la misma clave, cada valor se escribirá en el archivo de configuración. Esto hace que sea seguro, por ejemplo, agregar especificaciones de captura adicionales al control remoto de origen.

Más información

Relojero
fuente
24

Ejecutar me git config --system core.longpaths truearrojó un error:

"error: no se pudo bloquear el archivo de configuración C: \ Archivos de programa (x86) \ Git \ mingw32 / etc / gitconfig: Permiso denegado"

Solucionado con la ejecución del comando a nivel global:

git config --global core.longpaths true
Arpit Aggarwal
fuente
La configuración global afecta solo al usuario actual, mientras que la configuración del sistema afecta a todos los usuarios de la máquina. Si esta es su estación de trabajo, son efectivamente las mismas que puede usar solo un usuario.
toalla
44
Si su aplicación de línea de comando funciona como administrador, ¡el primer comando funcionaría!
Sachith Dickwella
12

También podría intentar habilitar rutas de archivo largas.

Si ejecuta Windows 10 Home Edition, podría cambiar su Registro para habilitar rutas largas.

Ir a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemen regedity ajuste LongPathsEnableda 1.

Si tiene Windows 10 Pro o Enterprise, también puede usar las Políticas de grupo local.

Vaya a Configuración del equipoPlantillas administrativasSistemaSistema de archivos en gpedit.msc, abierta Habilitar Win32 rutas largas y ponerlo en Habilitado .

Julian Veerkamp
fuente
55
Creo que esto debe hacerse en combinación con la configuración de git, y vale la pena señalar que no funciona con el Explorador de Windows por las razones mencionadas aquí .
Neo
11
git config --global core.longpaths true

El comando anterior funcionó para mí. El uso de '--sistema' me dio un error de archivo de configuración no bloqueado

amalik2205
fuente
2
Para los usuarios de Github Desktop, este es el único que funciona porque Github Desktop utiliza su propia configuración de Git.
Csaba
4

Mueva el repositorio a la raíz de su unidad (corrección temporal)

Puede intentar mover temporalmente el repositorio local (la carpeta completa) a la raíz de su unidad o lo más cerca posible de la raíz.

Como la ruta es más pequeña en la raíz de la unidad, a veces soluciona los problemas.

En Windows, movería esto a C:\la raíz de otra unidad.

Dheeraj Bhaskar
fuente
2
Esto es lo único que resolvió mi problema. Era que tenía demasiadas carpetas en el camino.
J Brune
2

También tuve este error, pero en mi caso la causa fue usar una versión desactualizada de npm, v1.4.28.

Actualización a npm v3 seguido de

rm -rf node_modules
npm -i

trabajó para mi. El número 2697 de npm tiene detalles de la estructura de carpetas "máximamente plana" incluida en npm v3 (publicado el 25/06/2015).

James Green
fuente
1

Si está trabajando con su partición encriptada, considere mover la carpeta a una partición sin encriptar, por ejemplo a / tmp , ejecutándose git pully luego retrocediendo.

augustowebd
fuente
0

En una máquina de windows

Ejecute el símbolo del sistema como administrador y luego ejecute el siguiente comando

git config --system core.longpaths true

kartick shaw
fuente