Nom de fichier trop long dans Git pour Windows

665

J'utilise Git-1.9.0-preview20140217pour Windows. Comme je le sais, cette version devrait résoudre le problème avec des noms de fichiers trop longs. Mais pas pour moi.

Certes , je fais quelque chose de mal: je l' ai fait git config core.longpaths trueet git add .puis git commit. Tout s'est bien passé. Mais quand je fais maintenant un git status, j'obtiens une liste de fichiers avec Filename too long, par exemple:

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

C'est assez simple à reproduire pour moi: il suffit de créer une application web Yeoman avec le générateur angulaire ("yo angular") et de le supprimer node_modulesdu .gitignorefichier. Répétez ensuite les commandes Git susmentionnées.

Qu'est-ce que j'oublie ici?

Papa Mufflon
la source
Où lisez-vous que cette version devrait corriger les longs noms de fichiers?
iveqy
Voici la demande de pull pour le patch: github.com/msysgit/git/pull/122
Papa Mufflon
@PapaMufflon pouvez-vous changer la réponse acceptée à celle qui a le plus de points? Cela m'a beaucoup aidé.
v.karbovnichy
@ v.karbovnichy, veuillez lire attentivement ma question. J'ai déjà exécuté la commande dans la réponse la plus votée. Mais au moment où j'ai posé la question, la réponse acceptée était correcte: msys avait toujours cette limitation de caractère. Maintenant que cette limitation a disparu, git config core.longpaths true fonctionne comme il se doit.
Papa Mufflon
Ok, je suis d'accord alors
v.karbovnichy

Réponses:

707

Git a une limite de 4096 caractères pour un nom de fichier, sauf sous Windows lorsque Git est compilé avec msys. Il utilise une ancienne version de l'API Windows et il y a une limite de 260 caractères pour un nom de fichier.

Donc, pour autant que je comprends cela, c'est une limitation de msys et non de Git. Vous pouvez lire les détails ici: https://github.com/msysgit/git/pull/110

Vous pouvez contourner cela en utilisant un autre client Git sous Windows ou définissez- core.longpathsle truecomme expliqué dans d'autres réponses.

git config --system core.longpaths true

Git est construit comme une combinaison de scripts et de code compilé. Avec la modification ci-dessus, certains scripts peuvent échouer. C'est la raison pour laquelle core.longpaths ne doit pas être activé par défaut.

La documentation Windows sur https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file contient quelques informations supplémentaires:

À partir de Windows 10, version 1607, les limitations MAX_PATH ont été supprimées des fonctions de fichier et de répertoire Win32 courantes. Cependant, vous devez accepter le nouveau comportement.

Une clé de registre vous permet d'activer ou de désactiver le nouveau comportement de chemin long. Pour activer le comportement de chemin long, définissez la clé de Registre dans HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled (Type: REG_DWORD)

iveqy
la source
19
La limitation à 260 caractères dans un chemin n'est pas spécifique à MSYS, c'est une imitation générale de l'API Windows. Cela peut être résolu en utilisant des chemins Unicode, mais cela a d'autres inconvénients, c'est pourquoi il core.longpathsn'est pas activé par défaut. Notez également que Git pour Windows n'est pas compilé avec MSYS. Au lieu de cela, il s'agit d'une application Windows native qui est fournie avec un environnement MSYS dépouillé.
sschuberth
3
@sschuberth: Y a-t-il des inconvénients autres que le manque de compatibilité avec les programmes qui ne prennent pas en charge les chemins longs?
JAB
3
@JAB Un autre inconvénient est que les longs trajets doivent toujours être absolus; les chemins relatifs ne sont pas pris en charge. Pour plus de détails, veuillez voir ici .
sschuberth
4
Ou comme solution rapide, essayez simplement de récupérer votre dépôt dans C: / sous Windows, réduisant ainsi le nombre de caractères de chemin de dossier.
Akshay Lokur
5
Pour info, à l'heure actuelle, le problème persiste. On pourrait envisager de poursuivre le développement sur un vrai système d'exploitation ...
Géza Török
1035

Vous devriez pouvoir exécuter la commande

git config --system core.longpaths true

ou ajoutez-le manuellement à l'un de vos fichiers de configuration Git pour activer cette fonctionnalité, une fois que vous êtes sur une version prise en charge de Git. Il ressemble peut-être à la version 1.9.0 et aux versions ultérieures.

sparkym3
la source
13
Cette option de configuration a résolu le problème pour moi, même avec msys comme mentionné dans la réponse acceptée. (Plus précisément, la version 1.9.4.msysgit.2).
Alex Osborn
5
Sourcetree agit un peu bizarrement à moins que vous "vous assuriez également que SourceTree utilise le Git du système et non celui intégré." - Merci à Matej Drolc pour ce conseil
bstoney
38
Voici quelques informations générales expliquant pourquoi cela n'est pas activé par défaut, et quelques détails techniques.
sschuberth
12
get "n'a pas pu verrouiller le fichier de configuration C: \ Program Files \ Git \ mingw64 / etc / gitconfig" après avoir exécuté la commande ci-dessus. Mais la réponse @Yash a fonctionné pour moi
divideByZero
10
@divideByZero exécutant git bash en tant qu'administrateur empêche cette erreur.
Niek
205

Cela pourrait aider:

git config core.longpaths true

Explication de base: Cette réponse suggère de ne pas appliquer un tel paramètre aux configurations du système global (à tous les projets, afin d'éviter --systemou d' --globalétiqueter). Cette commande ne résout le problème qu'en étant spécifique au projet en cours.

Sagiruddin Mondal
la source
13
Les gens ici ont noté que ce paramètre peut introduire un comportement imprévisible, il semble donc qu'il est préférable d'utiliser la commande ci-dessus comme paramètre local sur les projets où cela l'exige plutôt que de l'ajouter --systemqui l'appliquera à tous les projets
Grant Humphries
4
Hé, c'est juste un copypaste de l'autre réponse très appréciée. pourrait à tout le moins expliquer pourquoi vous préférez supprimer l'option --system ..
Félix Gagnon-Grenier
79

Créez .gitconfig et ajoutez

[core]
longpaths = true

Vous pouvez créer le fichier dans un emplacement de projet (pas sûr) et également dans l'emplacement global. Dans mon cas, l'emplacement est C:\Users\{name}\.

Yash
la source
10
Vous pouvez également le faire avec la commande suivante:git config --global core.longpaths true
Curly
git config --global core.longpaths true a fonctionné pour moi merci
Rama Krshna Ila
1
En utilisant Visual Studio, les solutions git bash ci-dessus ne fonctionnaient pas pour moi, mais la recherche du fichier .git / config pour le projet et l'édition comme indiqué ci-dessus l'ont fait. Merci yash.
andrew pate
cela a fonctionné pour moi, j'ai localisé ce fichier et l'ai modifié manuellement
Patlatus
1
Les réponses mentionnées et vérifiées ci-dessus sont correctes mais avec les autorisations accordées au fichier, il peut ne pas être possible de mettre à jour le fichier avec ces commandes. Cette approche est vraiment facile car c'est l'approche manuelle et cela a très bien fonctionné pour moi. Vous pouvez facilement trouver le .gitconfigfichier dans le chemin suivant C:\Users\{username}et simplement le modifier.
Kavindu Narathota
53

Étapes à suivre:

  1. Exécutez Git Bash en tant qu'administrateur
  2. Exécutez la commande suivante:
git config --system core.longpaths true

Remarque : si l'étape 2 ne fonctionne pas ou donne une erreur, vous pouvez également essayer d'exécuter cette commande:

git config --global core.longpaths true

En savoir plus git config ici .

Saikat
la source
35

La meilleure solution est d'activer le paramètre longpath de Git.

git config --system core.longpaths true

Mais une solution de contournement qui fonctionne est de supprimer le dossier node_modules de Git:

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

Ajoutez node_modules dans une nouvelle ligne à l'intérieur du fichier .gitignore. Après cela, poussez vos modifications:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push
Janderson Silva
la source
3
Il y a une bonne raison de conserver le dossier node_modules dans git: si vous voulez que votre logiciel se comporte de la même manière après un an de modules potentiellement disparus de npm.
cfstras du
@cfstras si une bibliothèque a une vulnérabilité et que vous ne mettez pas à jour périodiquement, vous aurez certainement des problèmes de sécurité.
Janderson Silva
1
Bien sûr, vous devez mettre à jour vos dépendances. Mais seulement quand vous le voulez, et si quelque chose devait se casser, vous voudriez votre sauvegarde en git ...
cfstras
Est vrai. Je vais modifier ma réponse. Merci pour votre commentaire.
Janderson Silva
1
Pas besoin de s'engager node_modules: le packages.lockfichier est là pour s'assurer que la version installée par npm installsera toujours la même, jusqu'à ce que vous fassieznpm update
Pierre-Olivier Vares
32

Pour être entièrement sûr qu'il prend effet immédiatement après l'initialisation du référentiel, mais avant que l'historique distant ne soit récupéré ou que tous les fichiers soient extraits, il est plus sûr de l'utiliser de cette façon:

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

-c clé = valeur

Définissez une variable de configuration dans le référentiel nouvellement créé; cela prend effet immédiatement après l'initialisation du référentiel, mais avant la récupération de l'historique distant ou l'extraction de tout fichier. La clé est dans le même format que prévu par git-config 1 (par exemple, core.eol = true). Si plusieurs valeurs sont données pour la même clé, chaque valeur sera écrite dans le fichier de configuration. Cela permet, par exemple, d'ajouter en toute sécurité des références de récupération supplémentaires à la télécommande d'origine.

Plus d'informations

Horloger
la source
24

L'exécution git config --system core.longpaths truem'a renvoyé une erreur:

"erreur: impossible de verrouiller le fichier de configuration C: \ Program Files (x86) \ Git \ mingw32 / etc / gitconfig: autorisation refusée"

Correction de l'exécution de la commande au niveau global:

git config --global core.longpaths true
Arpit Aggarwal
la source
Les paramètres globaux affectent uniquement l'utilisateur actuel, tandis que les paramètres système affectent tous les utilisateurs de la machine. S'il s'agit de votre poste de travail, ils sont en fait les mêmes que vous ne pouvez utiliser qu'un seul utilisateur.
serviette
4
Si vous êtes une application de ligne de commande Ran en tant qu'administrateur, la première commande fonctionnera!
Sachith Dickwella
12

Vous pouvez également essayer d'activer les longs chemins d'accès aux fichiers.

Si vous exécutez Windows 10 Home Edition, vous pouvez modifier votre registre pour activer les longs chemins.

Aller à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemen regeditpuis mis LongPathsEnabledà 1.

Si vous avez Windows 10 Pro ou Enterprise, vous pouvez également utiliser des stratégies de groupe locales.

Aller à Configuration ordinateurModèles d' administrationSystèmeSystème de fichiers à gpedit.msc, ouvert Activer longs chemins Win32 et réglez -le sur Activé .

Julian Veerkamp
la source
5
Je crois que cela doit être fait en combinaison avec la configuration git, et il convient de noter que cela ne fonctionne pas avec l'Explorateur Windows pour les raisons mentionnées ici .
Neo
11
git config --global core.longpaths true

La commande ci-dessus a fonctionné pour moi. L'utilisation de '--system' m'a donné une erreur de fichier de configuration non verrouillé

amalik2205
la source
2
pour les utilisateurs de Github Desktop, c'est le seul qui fonctionne car Github Desktop utilise sa propre configuration Git.
Csaba
4

Déplacer le référentiel vers la racine de votre lecteur (correction temporaire)

Vous pouvez essayer de déplacer temporairement le référentiel local (le dossier entier) vers la racine de votre lecteur ou aussi près de la racine que possible.

Étant donné que le chemin est plus petit à la racine du lecteur, il résout parfois les problèmes.

Sous Windows, je déplacerais ceci vers C:\la racine d'un autre lecteur.

Dheeraj Bhaskar
la source
2
C'est la seule chose qui a résolu mon problème. C'est que j'avais trop de dossiers sur le chemin.
J Brune
2

J'ai également eu cette erreur, mais dans mon cas, la cause était une version obsolète de npm, v1.4.28.

Mise à jour vers npm v3 suivie de

rm -rf node_modules
npm -i

travaillé pour moi. Le problème npm 2697 contient des détails sur la structure de dossiers "au maximum plat" incluse dans npm v3 (publiée le 2015-06-25).

James Green
la source
1

Si vous travaillez avec votre partition chiffrée, envisagez de déplacer le dossier vers une partition non chiffrée, par exemple a / tmp , en cours d'exécution git pull, puis en revenant en arrière.

augustowebd
la source
0

Dans une machine Windows

Exécutez l'invite de commandes en tant qu'administrateur, puis exécutez la commande ci-dessous

git config --system core.longpaths true

kartick shaw
la source