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.
À 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
_).
Compte tenu des réponses ci-dessus, vous pouvez le faire fonctionner avec une seule commande avec "--force":
git mv --force myfile MyFile
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:
git add . -A
pour supprimer tous les fichiers.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.
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.
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
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.
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)