Git n'est-il pas sensible à la casse?

96

Dans le premier engagement de mon partiel appelé, _Electronicsil était écrit en commençant par une majuscule, puis je l'ai changé en _electronics.

Git sous cygwin a ignoré le cas après avoir validé le nouveau nom, j'ai donc changé le nom à la main dans le dépôt cible.

Maintenant, il change parfois le _electronicspartiel engagé en _Electronics.

Qu'est ce que j'ai mal fait?

JAkk
la source
9
Sur quel OS êtes-vous?
Keith Thompson
10
Quel système de fichiers utilisez-vous?
Andrew Marshall
Windows avec cygwin. Mon serveur exécute Ubuntu Linux. Je ne connais pas le système de fichiers, je suppose ext3 ou ext2 - mon fournisseur a configuré l'installation minimale.
JAkk
N'êtes-vous pas heureux que Windows ait décidé de ne pas respecter la casse?
Cascabel
4
Windows est insensible à la casse, mais parfois (plus souvent aujourd'hui) cas préserver .
Arafangion

Réponses:

73

Cela sera considéré comme 2 choses différentes mais vous causera des problèmes sur un système non sensible à la casse. Si tel est le cas, assurez-vous de compléter par tabulation tous les chemins ou noms de fichiers. De plus, pour changer le nom de quelque chose dans le cas précis, procédez comme suit:

mv file.txt temp.txt
git add -A
git commit -m "renaming..."
mv temp.txt File.txt
git add -A
git commit --amend -m "Renamed file.txt to File.txt"

C'est une manière explicite d'apporter des modifications en les validant, puis en réduisant les validations. Un moyen plus court de le faire est de manipuler l'index et le dossier de travail en un seul:

git mv file.txt temp.txt
git mv temp.txt File.txt
git commit -m "Renamed file.txt to File.txt"

Ceci est également lié à l'ajustement des noms de répertoire: git mv et ne change que la casse du répertoire

Adam Dymitruk
la source
on dirait que c'était vrai (sauf que je passais des majuscules aux minuscules)
JAkk
J'ai jeté un coup d'œil dedans, tant que je suis habitué à cygwin, il est juste plus confortable d'utiliser cygwin - merci pour l'indice
JAkk
Vous pouvez simplement le faire git mv file.txt File.txt. Je ne sais pas s'il s'agit d'une nouvelle fonctionnalité git.
Phil
107

Cela dépendra de la core.ignorecasevaleur de configuration, qui est définie sur false dans les systèmes de fichiers sensibles à la casse et true dans msysgit sous Windows.

core.ignorecase

Si elle est vraie, cette option permet diverses solutions de contournement pour permettre à git de mieux fonctionner sur les systèmes de fichiers qui ne sont pas sensibles à la casse, comme FAT. Par exemple, si une liste de répertoires trouve "makefile" alors que git attend "Makefile", git supposera que c'est vraiment le même fichier et continuera à s'en souvenir comme "Makefile".

La valeur par défaut est false, sauf que git-clone (1) ou git-init (1) sondera et définira core.ignorecase true si nécessaire lors de la création du référentiel.

Plus de détails dans cette réponse à Changer la capitalisation des noms de fichiers dans Git .

manojlds
la source
79
C'est la bonne réponse imo. Pour le futur moi, utilisez git config --unset-all core.ignorecase && git config --system core.ignorecase falseavec sudo.
Znarkus
2
idem pour James, @Znarkus a identifié le correctif de ce problème sur OS X, merci!
Craig Nakamoto
1
@Znarkus Fonctionne également sur Windows. Belle.
orlade
9
@Znarkus, le problème avec cela sur OSX est que lorsque vous renommez un fichier via le Finder, et que vous ne changez que la casse, git verra la version renommée comme un fichier complètement nouveau, mais il ne génère pas de "suppression" correspondante action pour l'ancienne version du fichier. Donc, si vous validez et poussez vers github, github aura à la fois l'ancien et le nouveau fichier, mais votre système local n'aura que le nouveau fichier, et git n'en sera pas plus sage.
ivanreese
2
@spiralganglion Pour les développeurs Web sur OSX, je peux vraiment recommander de créer une partition sensible à la casse , puis de la monter comme répertoire www.
Znarkus
23

C'est beaucoup plus simple:

git mv Electronics electronics -f
git commit -m "That was easy!"
Arnoud
la source
1
Avez-vous essayé ceci sur un système de fichiers insensible à la casse?
Edward Thomson
1
J'ai d'abord lu ceci comme l'affiche originale essayant d'effectuer un changement de casse du nom d'un dossier, pas d'un fichier. Maintenant que j'ai relu ceci, ce n'est pas clair. En effet, mv -ffonctionnera pour un fichier.
Edward Thomson
21
git config --system core.ignorecase false
Cemo
la source
0

Dans mon scénario, j'avais deux dossiers testset Testsqui apparaissaient comme deux dossiers séparés dans Github mais un seul Testsdossier dans Windows. Mon objectif était de les combiner en tests.

J'ai utilisé l'approche suivante:

  1. Créer un nouveau dossier temp
  2. Copier tout le contenu de Testsverstemp
  3. Supprimer Tests
  4. exécuter git rm Tests -r
  5. Renommer tempentests
Jeroen Vannevel
la source
0

J'ai essayé de résoudre le problème et cela a réussi sur Windows10

Supposons qu'il y ait deux dossiers sur bitbucket TEST et test, mais lorsque je clone le repo sur le disque, il ne crée que TEST et je veux garder le test sous forme de dossier unique sur git qui contient tous les fichiers.

J'aurai besoin d'exécuter les commandes suivantes sur la ligne de commande git mv TEST test1 -f git mv texte1 test -f git commit -m "renommer ..." git push

Vous verrez maintenant que la hiérarchie des dossiers est corrigée sur bitbucket.

Nitesh Goyal
la source