web-dev-qa-db-fra.com

Changer la capitalisation des noms de fichiers dans Git

J'essaie de renommer un fichier avec une capitalisation différente de celle qu'il avait auparavant:

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 constater, Git se plaint de ça. J'ai essayé de renommer en utilisant simplement la vieille commande mv, mais git ne prend pas le changement de nom (en tant que renommage o en tant que nouveau fichier non suivi).

Comment puis-je changer un fichier pour avoir une capitalisation différente du même nom? Je suis sous Mac OS X 10.7.3 avec git 1.7.9.1 avec zsh 4.3.15.

407
knpwrs

À partir de git 2.0.1 (25 juin 2014), un _git mv_ ne fonctionnera que sur les systèmes d'exploitation insensibles à la casse .

Voir commit baa37bf par David Turner (_dturner-tw_)

mv: autorise le changement de nom pour corriger la casse sur des 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 l'erreur "_destination already exists_", car ces deux noms font référence 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 lors de la prochaine validation.

Détectez ce cas et autorisez-le sans requérir "_--force_".

_git mv hello.txt Hello.txt_ fonctionne simplement (plus besoin de _--force_).

453
VonC

Compte tenu des réponses ci-dessus, vous pouvez le faire fonctionner avec une seule commande avec "--force":

 git mv --force myfile MyFile
432
Marcello de Sales

Parfois, vous souhaitez modifier la mise en majuscule de nombreux fichiers sur un système de fichiers insensible à la casse (par exemple sous OS X ou Windows). Faire git mv commande fatiguera vite, pour faciliter les choses, voici ce que je fais:

  1. Déplacez tous les fichiers en dehors du répertoire pour laisser le bureau.
  2. Faites un git add . -A pour supprimer tous les fichiers.
  3. Renommez tous les fichiers du bureau avec la casse appropriée.
  4. Déplacez tous les fichiers dans le répertoire d'origine.
  5. Faites un git add . git devrait voir que les fichiers sont renommés.

Maintenant, vous pouvez faire un commit en disant que vous avez changé la capitalisation du fichier.

83
MrHus

Les noms de fichiers sous OS X ne font pas la distinction entre les majuscules et les minuscules (par défaut). C'est plus un problème de système d'exploitation qu'un problème de git. Si vous supprimez et ré-ajoutez le fichier, vous devriez obtenir ce que vous voulez ou le renommer en quelque chose d'autre et le renommer.

59
larsks

Comme l'OP concerne "Changer la capitalisation des noms de fichiers dans Git":

Si vous essayez de changer la capitalisation d'un nom de fichier dans votre projet, vous n'avez pas besoin de forcer le renommer de git. OMI, je préférerais changer la capitalisation de mon IDE/éditeur et s’assurer que je configure correctement git pour prendre le changement de nom.

Par défaut, un modèle git est configuré pour ignorer la casse (insensible à la casse git). Pour vérifier que vous avez le modèle par défaut, utilisez --get pour récupérer la valeur d'une clé spécifiée. Utilisez --local et --global pour indiquer à git s'il faut récupérer la valeur-clé config de votre configuration git repo locale ou globale. As, un exemple si vous souhaitez rechercher votre clé globale core.ignorecase:

git config --global --get core.ignorecase

Si cela retourne true assurez-vous de le définir comme suit:

git config --global core.ignorecase false

(Assurez-vous que vous avez les autorisations nécessaires pour changer globalement) Et voilà, votre git n'ignorera plus les capitalisations et les traitera comme des changements.

A titre de suggestion, si vous travaillez sur des projets multilingues et que vous estimez que tous les projets ne doivent pas être traités comme sensibles à la casse par git, il suffit de mettre à jour le fichier local core.ignorecase

23
Segmented

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

Pour regrouper les fichiers git mv en minuscule sous macOS:

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

Tous les fichiers d’un dossier seront en minuscule.

1
softarn

Cet extrait python git mv --force tous les fichiers d'un répertoire seront en minuscule, par exemple: foo/Bar.js deviendra foo/bar.js via git mv foo/Bar.js foo/bar.js --force

Modifiez-le à votre convenance, juste pensé 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)
1
blented