Changer la casse d'un fichier sous Windows?


209

Il y a quelques fichiers dans notre base de code contrôlée par git que je voudrais renommer. Plus précisément, je veux juste changer la casse du fichier, ce qui sourceCode.javadevient SourceCode.java, par exemple. Le hic: je suis sur une boîte Windows et le système de fichiers pense qu'il s'agit du même nom de fichier.

Comment puis-je faire en sorte que Windows et Git reconnaissent ce changement et l'enregistrent?


3
Depuis Git 2.0.1+ (juin 2014), un simple git mvdevrait fonctionner ( stackoverflow.com/a/24979063/6309 ). Même sous Windows.
VonC

Réponses:


337

Jetez un œil ici pour plus de conseils sur la façon de le faire:

Comment faire git ignorer les changements au cas où?

Ou:

git mv -f name.java Name.java

8
En aparté, cela ne fonctionne pas sur un système de fichiers FAT. Je porte du code de projet sur une clé USB et les changements de cas sont vraiment pénibles.
asm

1
Cela n'a pas fonctionné pour moi sur le système NTFS et Windows 10
Roboblob

1
C'est sûrement la bonne façon de le faire, mais si vous devez renommer un grand nombre de fichiers, cela peut être fastidieux. Si vous les avez déjà renommés dans le système de fichiers d'une manière ou d'une autre et que vous souhaitez simplement valider ces modifications, vous pouvez renommer un dossier parent, faire un git addde ce dossier nouvellement renommé, NE PAS COMMITER, changer le nom du dossier en ce qu'il devrait être. , git addpuis recommencez.
Okonomiyaki3000

Fonctionne sur NTFS et Windows 7.
Hans Goldman

Est-il possible de le faire en vrac? par exemple avec PowerShell,Get-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
killjoy

49

Si vous utilisez un système de fichiers FAT, votre seul choix est de renommer en deux étapes:

  1. Renommer sourceCode.javaenanything.you.like
  2. Renommer anything.you.likeenSourceCode.java

À l'époque où nous utilisions Perforce, nous avions exactement ce problème et c'était la seule solution que nous pouvions trouver.


13
Juste une note pour les autres: il n'est pas nécessaire de s'engager entre les deux, mais il est nécessaire d'ajouter à l'index pour que git remarque un changement
arberg

29

Les étapes suivantes m'ont permis de changer le cas sous Windows:

  • Ajouter ignorecase = falseà [core]en .git/config;
  • Déplacez les fichiers que vous allez renommer hors du répertoire de votre projet;
  • Ajoutez les suppressions à l'index;
  • Ramenez tous les fichiers à leur emplacement d'origine et changez la casse des fichiers et / ou répertoires;
  • Ajoutez tous les "nouveaux" fichiers à l'index;
  • Supprimer ignorecase = falseajouté à la première étape.

De cette façon, vous avez un seul commit qui contient le renommage et il est facile de changer par exemple un répertoire entier.


5
Faites-le pour les paramètres globaux et locaux du bain: $ gti config --global core.ignorecase false $ gti config core.ignorecase false
Roman Ivanov

6

Faites attention. Cela peut entraîner des modifications impossibles à fusionner. Git est confus lors de la fusion sous Windows car il ne peut pas décider si l'ancien nom en majuscules et le nouveau nom en minuscules sont le même fichier ou non (pour Git ils ne le sont pas, mais pour le système de fichiers qu'ils sont). Pour fusionner, vous devez effectuer une solution de contournement manuelle, comme la suppression des fichiers avant la fusion.

Voir problème de rebase Git avec des fichiers du même nom mais avec un cas différent

Je ne sais pas si ce problème est pire que d'avoir un fichier au nom non conventionnel dans votre projet pour toujours, mais il vaut la peine de savoir s'il y a beaucoup d'utilisateurs avec beaucoup de branches qui devront toutes être fusionnées à terme.


Les fichiers nommés de manière non conventionnelle dans les projets moyens à grands doivent toujours être évités si possible en raison de problèmes lors du développement pour plusieurs plates-formes (retarder la correction de quelque chose comme ça jusqu'à plus tard rendra les problèmes de la correction plus graves). Parfois, vous développez sur Windows, mais vous devez également effectuer une génération Linux, et une inclusion qui fonctionnerait correctement sur Windows provoque la rupture de la génération sur Linux.
Griffork

3

À mon avis, il manque un moyen simple. Vous pouvez le faire pour un seul fichier, un répertoire spécifique ou même l'ensemble du référentiel:

git rm --cached <file name or directory>
git add <file name or directory>

Si vous souhaitez affecter également les sous-répertoires, vous devez utiliser l' -rindicateur:

git rm -r --cached <directory>
git add <directory>

Vraiment le plus simple.
ranu

Cela perd tout l'historique du fichier, car il est défini par git comme un tout nouveau.
Alejandro

@Alejandro Ce que vous dites est faux. Je viens de le tester et git a reconnu le changement de nom sans aucun problème. Comme dans d'autres cas, le fichier est affiché comme supprimé / nouveau dans l'index, mais lors de la validation, git remarque qu'il vient d'être renommé.
Nils-o-mat

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.