web-dev-qa-db-fra.com

git mv et ne change que la casse du répertoire

Bien que j'ai trouvé similaire question Je n'ai pas trouvé de réponse à mon problème

Quand j'essaie de renommer le répertoire de FOO à foo via git mv FOO foo Je reçois

fatal: renaming 'FOO' failed: Invalid argument

D'ACCORD. Alors j'essaie git mv FOO foo2 && git mv foo2 foo

Mais quand j'essaye de commettre via git commit . Je reçois

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

Quand j'ajoute le répertoire via git add foo rien ne change et git commit . me donne à nouveau le même message.

Qu'est-ce que je fais mal? Je pensais utiliser un système sensible à la casse (OSX), pourquoi ne puis-je pas simplement renommer le répertoire?

247
oschrenk

Vous êtes dans un environnement insensible à la casse. En outre, en ajoutant avec le -A ne prendra pas soin du côté supposé du mv tel que Git le comprend. Attention! Assurez-vous qu’il n’ya pas d’autres modifications ni de fichiers non suivis dans votre disque, sinon ils seront validés dans le cadre de ce changement! git stash -u d'abord, faites ceci et ensuite git stash pop après. Continuant: Pour résoudre ce problème, procédez comme suit:

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

C'est le moyen le plus simple de changer le répertoire de travail, de valider et ensuite de réduire les 2 commits. Vous pouvez simplement déplacer le fichier dans l'index, mais pour une personne novice dans git, cela peut ne pas être assez explicite quant à ce qui se passe. La version courte est

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

Comme suggéré dans l'un des commentaires, vous pouvez également faire une rebase interactive (git rebase -i HEAD~5 si le mauvais cas a été introduit il y a 5 jours) pour y remédier sans que le mauvais cas n'apparaisse nulle part dans l'historique. Vous devez faire attention si vous faites cela, car les hachages de validation seront différents et les autres devront rebaser ou fusionner leur travail avec ce passé récent de la branche.

Ceci est lié à la correction du nom d'un fichier: git n'est-il pas sensible à la casse?

383
Adam Dymitruk

Vous voulez définir l'option core.ignorecase to false, ce qui obligera Git à prêter attention aux cas sur les systèmes de fichiers qui ne le prennent pas en charge de manière native. Pour activer dans votre repo:

$ git config core.ignorecase false

Ensuite, vous pouvez renommer le fichier avec git mv et ça fonctionnera comme prévu.

139
mipadi

J'ai pu résoudre ce problème en utilisant git 1.7.7 en utilisant un nom de fichier temporaire:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
58
mgadda

(git mv- variante libre.)

J'ai rencontré ce problème dans Git sous Mac OS X 10.9. Je l'ai résolu comme suit:

git rm -r --cached /path/to/directory

Cela met le répertoire en attente de suppression dans Git mais ne supprime pas réellement les fichiers physiques (--cached). Cela rend également le répertoire, maintenant avec le cas approprié, affiché dans des fichiers non suivis.

Donc, vous pouvez faire ceci:

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

Git reconnaîtra par la suite que vous avez renommé les fichiers et que git status vous devriez voir un certain nombre de renamed: lignes. Inspectez-les et assurez-vous qu'ils ont l'air corrects et, le cas échéant, vous pouvez valider les modifications normalement.

13
wizonesolutions

Forcer avec l'option -f:

git mv -f FOO foo
8
konyak

C'est une solution rapide et sans risque d'erreur:

git mv -f path/to/foo/* path/to/FOO/

Attention! Renommez toujours tous les fichiers du dossier renommé (utilisez /*).

Ne renommez pas un seul fichier. Cela conduit à un bogue, décrit dans ce réponse .

Si vous voulez d’abord voir le résultat, utilisez -n:

git mv -f -n path/to/foo/* path/to/FOO/

Après avoir créé un mv:

  1. Valider les modifications
  2. Passer à une autre révision
  3. Retour à la caisse.

Maintenant, Git aurait dû renommer le dossier BOTH dans ses fichiers internes et dans son système de fichiers.

8
Nick Volynkin

Vous n'utilisez pas de système de fichiers sensible à la casse dans OS X, à moins que vous ne le choisissiez explicitement. HFS + can doit être sensible à la casse, mais la valeur par défaut est insensible à la casse.

2
Nicholas Knight

J'ai eu un problème connexe.

Un dossier nommé 'Pro' (créé en premier) et un autre 'pro' (créé par erreur). Sous Mac, c'est la même chose, mais différent selon git.

$ git config core.ignorecase false

git config a renommé les fichiers dans le bon dossier (merci) et a également créé des fichiers fantômes dans "pro" (non !!). Je ne pouvais pas ajouter de modifications de fichiers fantômes à la piste et je ne pouvais pas vérifier d'autres branches à moins de transporter ces fichiers avec moi, et je ne pouvais pas non plus le réinitialiser.

Au lieu de cela, j'ai fait

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

Pour plus de sécurité, je l’ai fait dans une branche de correctif séparée, puis j’ai fusionné avec la branche principale.

Pour le problème de fichier fantôme créé par, tout guru peut-il expliquer comment et pourquoi? Merci d'avance.

2
Liang

Voici une solution très simple autour de tout le gitfoo sur cette page.

  1. Copiez les fichiers de votre projet manuellement.
  2. git rm tous les fichiers.
  3. git commettre comme d'habitude.
  4. rajoutez les fichiers manuellement.
  5. git ajoute tous les fichiers.
  6. git commettre comme d'habitude.
  7. profit.
1
Askdesigners

Améliorer la réponse d'Adam Dymitruk (idiot que SO ne me laisse pas commenter sa réponse), utiliser "git mv" organisera automatiquement les fichiers déplacés. Aucun stockage n'est nécessaire et le risque "git add" -A "peut être évité:

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";
0
Rainer Blome