Modification de la capitalisation des noms de fichiers dans Git

473

J'essaie de renommer un fichier pour avoir une capitalisation différente de ce qu'il avait avant:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

Comme vous pouvez le voir, Git jette un coup sur cela. J'ai également essayé de renommer en utilisant simplement l'ancienne mvcommande, mais Git ne récupère pas le renommage (en tant que renommage ou en tant que nouveau fichier non suivi).

Comment puis-je changer un fichier pour avoir une autre majuscule du même nom? Je suis sur Mac OS X v10.7.3 (Lion) avec Git 1.7.9.1 en utilisant Z shell (zsh) 4.3.15.

knpwrs
la source
49
c'est parce que le système de fichiers osx respecte la casse et ne respecte pas la casse par défaut. Vous pouvez simplement procéder en deux étapes:git mv myfile foo; git mv foo MyFile
tonio
16
Je l'ai fait fonctionner avec "git mv --force myfile MyFile".
Marcello de Sales
7
À partir de git 2.0.1 (juin 2014), git mv hello.txt Hello.txtfonctionnera sur un système d'exploitation insensible à la casse. Voir ma réponse ci
VonC
1
Liaison stackoverflow.com/questions/1793735/…
Oleg Estekhin

Réponses:

554

À partir de Git 2.0.1 (25 juin 2014), a git mvfonctionnera simplement sur un système d'exploitation insensible à la casse .

Voir commit baa37bf par David Turner ( dturner-tw) .

mv: permet de renommer pour corriger la casse sur les systèmes de fichiers insensibles à la casse

" git mv hello.txt Hello.txt" sur un système de fichiers insensible à la casse déclenche toujours " destination already exists" l'erreur, car ces deux noms se réfèrent au même chemin du point de vue du système de fichiers et obligent l'utilisateur à donner " --force" lors de la correction de la casse du chemin enregistré dans l'index et dans le commit suivant.

Détectez ce cas et autorisez-le sans exiger " --force".

git mv hello.txt Hello.txtfonctionne juste (plus --forcenécessaire).


L'autre alternative est:

git config --global core.ignorecase false

Et renommez le fichier directement; git ajouter et valider.

VonC
la source
2
FWIW cela a régressé ou n'a jamais fonctionné sur Windows. Suis sur 2.15.1.windows.2 et dois encore utiliser --force
TTimo
1
@Adowrath Excellentes nouvelles!
VonC
Cela fonctionnera-t-il également pour la capitalisation des extensions Par exemple, si j'ai le nom de fichier image.TXT et que je veux le renommer comme image.txt
siluveru kiran kumar
@siluverukirankumar Oui. Avez-vous rencontré un problème avec cette utilisation?
VonC
1
Je l'ai fait fonctionner sur Windows en exécutant cette commande etgit config core.ignorecase false
John Targaryen
453

Compte tenu de la réponse de larsks , vous pouvez le faire fonctionner avec une seule commande avec "--force":

 git mv --force myfile MyFile
Marcello de Sales
la source
3
Si vous utilisez un système de fichiers insensible à la casse et que vous obtenez une erreur fatale "Argument invalide", essayez plutôt ces étapes: stackoverflow.com/questions/3011625/…
Levi
1
Bien que ce soit la bonne réponse pour la première étape, comment procéder pour passer à une autre branche sous Mac OS X lorsque l'autre branche a l'ancienne capitalisation. J'obtiens une erreur ****: Les fichiers d'arborescence de travail non suivis suivants seraient écrasés par la caisse: ****
TJChambers
1
Cela a échoué lors de la validation pour moi sous Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog
98

Parfois, vous souhaitez modifier la mise en majuscule d'un grand nombre de noms de fichiers sur un système de fichiers insensible à la casse (par exemple sous OS X ou Windows). Les git mvcommandes se fatiguent rapidement. Pour rendre les choses un peu plus faciles, voici ce que je fais:

  1. Déplacez tous les fichiers en dehors du répertoire vers, disons, le bureau.
  2. Faites un git add . -Apour supprimer tous les fichiers.
  3. Renommez tous les fichiers sur le bureau à la bonne capitalisation.
  4. Replacez tous les fichiers dans le répertoire d'origine.
  5. Faites un git add .. Git devrait voir que les fichiers sont renommés.

Vous pouvez maintenant valider en indiquant que vous avez modifié la capitalisation du nom de fichier.

MrHus
la source
3
Cela se fait au détriment de toute l'histoire dans les fichiers dans lesquels vous vous déplacez, non? Je suppose que le git mv --force n'a pas cette lacune.
LOAS
12
Non, cela ne supprimerait pas toute l'histoire. Notez qu'il n'y a pas de validation entre les deux ajouts.
Michael L Perry
63

Les noms de fichiers sous OS X ne sont pas sensibles à la casse (par défaut). Il s'agit plus d'un problème de système d'exploitation que d'un problème Git. Si vous supprimez et lisez le fichier, vous devriez obtenir ce que vous voulez, ou le renommer en quelque chose d'autre, puis le renommer.

larsks
la source
2
Vous pouvez également git clonele repo sur un système Linux, renommer les fichiers et les valider juste pour cette situation (si vous avez un système Linux à portée de main).
gitaarik
4
En fait, les systèmes de fichiers sur OS X peuvent être sensibles à la casse, vous pouvez le configurer lors de l'installation. Comment vérifier si une partition OS X est sensible à la casse
Flimm
2
... d'où le "(par défaut)" dans la réponse.
larsks
4
Pour confirmer, vous pouvez utiliser git rm --cached fileorfolderpour supprimer le fichier ou le dossier de git sans supprimer le fichier ou le dossier du système de fichiers. Ensuite, vous pouvez simplement ajouter à nouveau le fichier ou le dossier avec git add fileorfolder.
KAS
32

Réglez ignorecasesurfalse in git config

Comme le message d'origine concerne "Changer la capitalisation des noms de fichiers dans Git":

Si vous essayez de modifier la capitalisation d'un nom de fichier dans votre projet, vous n'avez pas besoin de forcer renommage depuis Git. IMO, je préfère changer la capitalisation de mon IDE / éditeur et m'assurer que je configure correctement Git pour récupérer le changement de nom.

Par défaut, un modèle Git est défini pour ignorer la casse (insensible à la casse Git). Pour vérifier que vous disposez du modèle par défaut, utilisez --getpour récupérer la valeur d'une clé spécifiée. Utilisez --localet --globalpour indiquer à Git s'il faut récupérer une valeur-clé de configuration à partir de votre configuration de référentiel Git locale ou globale. Par exemple, si vous souhaitez rechercher votre clé globale core.ignorecase:

git config --global --get core.ignorecase

Si cela revient true, assurez-vous de le définir comme:

git config --global core.ignorecase false

(Assurez-vous que vous disposez des autorisations appropriées pour modifier global.) Et vous l'avez; maintenant votre installation Git n'ignorerait pas les majuscules et les traiterait comme des changements.

À titre de suggestion, si vous travaillez sur des projets multilingues et que vous pensez que tous les projets ne doivent pas être traités comme sensibles à la casse par Git, mettez simplement à jour le core.ignorecasefichier local .

Segmenté
la source
6
Et si git config --global --get core.ignorecasene retourne rien. Est-ce true?? car après l'avoir défini, falseil retourne false (Windows 10)
fralbo
Et cela ne semble pas fonctionner comme prévu. Je veux dire que le client de bureau voit le changement mais après validation / synchronisation, le nom de fichier reste inchangé en ligne!
fralbo
A fonctionné pour moi (et mieux pour plusieurs fichiers que d'utiliser git mv). Je suppose également que par défaut, il est considéré comme vrai (c'est-à-dire qu'il ignore la casse). Soit cela, soit il correspond à la stratégie du système d'exploitation pour la casse du nom de fichier.
Jerry
C'EST LA réponse. Je viens de l'utiliser.
Dave Everitt
1
Cela devrait être la réponse choisie
Dave Everitt
7

Vous pouvez ouvrir le répertoire ".git" puis éditer le fichier "config". Sous "[core]", définissez "ignorecase = true" et vous avez terminé;)

Деян Добромиров
la source
semble qu'il devrait être changé en faux de sorte que git soit sensible à la casse?
Jonathan
1

Pour regrouper des git mvfichiers en minuscules sur macOS:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

Il minuscule tous les fichiers d'un dossier.

softarn
la source
1

Cet extrait Python mettra git mv --forcetous les fichiers d'un répertoire en minuscules. Par exemple, foo / Bar.js deviendra foo / bar.js via git mv foo/Bar.js foo/bar.js --force.

Modifiez-le à votre guise. Je pensais juste que je partagerais :)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)
mélangé
la source
-1

Exemple de travail:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Daniel Batista
la source
2
Votre réponse ne résout pas la question d'origine. Vous réduisez l'extension
Tavo
Je cherche exactement cela, mais pour 500 images. je veux renommer ./src/images/TESTIMAGE.png en ./src/images/testimage.png sur git
Mohak Londhe