61 votes

Git : renommer un fichier manuellement, Git est confus

J'utilise Git et j'ai renommé manuellement un fichier que j'avais ajouté au référentiel. Maintenant, j'ai ajouté le "nouveau" fichier que j'ai renommé au référentiel mais Git se plaint que l'"ancien" fichier a été supprimé. Alors comment puis-je faire en sorte que Git oublie l'ancien fichier ? Mieux encore, comment puis-je dire à Git que le "nouveau" fichier est vraiment le "nouveau" fichier afin que je puisse garder l'historique des modifications intact ?

4 votes

git mv old new est essentiellement juste git rm --cached old; mv old new; git add new avec un peu plus d'intelligence. Git identifie les renommages en recherchant un contenu similaire, il les détectera donc, que vous ayez ou non utilisé git mv . C'est-à-dire qu'il n'y a aucun moyen de dire à que ces deux fichiers correspondent.

2 votes

Bizarre que presque 8 ans se soient écoulés et que git ne soit toujours pas capable de détecter le renommage

49voto

Jakob Borg Points 10869

Il n'y a aucun problème. Simplement git rm old ou même git add -A et il se rendra compte qu'il s'agit d'un renommage. Git verra le delete plus le add avec le même contenu comme un rename.

Vous n'avez pas besoin d'annuler, de déstocker, d'utiliser git mv etc. git mv old new n'est qu'un raccourci pour mv old new; git rm old; git add new .

11 votes

Si l'ancien fichier a déjà disparu, vous devez utiliser git rm --cached old puisqu'il n'y a pas de fichier à supprimer dans l'arbre de travail.

4 votes

Et si vous déplacez le fichier et changez quelques lignes, puis git add -A ? Git est-il assez intelligent pour savoir qu'un similaire est le même que l'ancien fichier ?

1 votes

De plus, s'il y a des changements dans le corps des fichiers, comme des déclarations #include différentes en raison d'un changement de nom de fichier, git le comprend toujours !

12voto

Amber Points 159296

Tout d'abord, annulez votre staged add pour le fichier déplacé manuellement :

$ git reset path/to/newfile
$ mv path/to/newfile path/to/oldfile

Ensuite, utilisez Git pour déplacer le fichier :

$ git mv path/to/oldfile path/to/newfile

Bien sûr, si vous avez déjà effectué le déplacement manuel, vous pouvez souhaiter revenir à la révision précédant le déplacement, et ensuite simplement git mv à partir de là.

5 votes

Cette dernière commande a donné une erreur : fatal : not under version control

0 votes

Il fallait juste faire : git add oldfile avant la dernière commande. MERCI AMBRE !

1 votes

Je note juste que j'ai initialement vu fatal: bad source, source=oldfile destination=newfile Je me suis alors rendu compte que les instructions de cette réponse tiennent déjà compte de ce problème en renommant le fichier déjà renommé en fichier d'origine :)

2voto

Essayez ça :

mv new old
git rm new
git mv old new

2 votes

Cela ne fonctionne pas. Git ne marque toujours pas le fichier comme renommé.

1 votes

Vous devez toujours mettre en scène le fichier avec git add new

0voto

user2394284 Points 97

Cela doit être automatisé. Je ne me souviens jamais de git avant de commiter, et je ne veux pas le faire.

#!/usr/bin/env python3

# This `git rm` wrapper respects the `--cached` option (like `git rm`).

import sys
import subprocess

if "--cached" in sys.argv:
    dest = sys.argv[-1]
    rest = sys.argv[1:-1]
    subprocess.check_call(["git", "add", dest])
    subprocess.check_call(["git", "rm"] + rest)
else:
    subprocess.check_call(["git", "mv"] + sys.argv[1:])

Je ne veux pas "me souvenir de git mv", car git mv ajoute un état caché derrière git diff c'est-à-dire implicitement ajouté à la prochaine livraison, même si vous explicitement commettre quelque chose qui n'a rien à voir. Je sais, c'est ce qu'on appelle l'état "staged", mais je n'aime pas ça. J'aime commettre sans surprises.

-3voto

Candida Ustine Points 1

Si cette erreur se produit, cela signifie probablement que le fichier que vous essayez de déplacer n'est pas initialement suivi par git ou que le répertoire dans lequel vous essayez de déplacer le fichier n'est pas un répertoire suivi par git.

0 votes

Comme l'OP l'a mentionné, il a déplacé le fichier qu'il avait déjà sous contrôle de version. Ce que vous décrivez, c'est la situation lorsque vous essayez de git mv un fichier qui n'est pas encore sous contrôle de version (donc un fichier qui n'a pas été ajouté à l'aide de l'option git add avant). Aujourd'hui, le message d'erreur de git sera très explicite sur le fait que le fichier n'a pas encore été enregistré dans vc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X