80 votes

Changer les noms de fichiers dans git repo

Comment git gère-t-il les modifications de nom de fichier?

Un changement de nom de fichier sera-t-il détecté comme une modification ou y aura-t-il un fichier "perdu" qui doit être supprimé et le nouveau fichier doit ensuite être ajouté avec git add ?

118voto

ralphtheninja Points 24346

Il sera automatiquement détecté comme une modification et le "nouveau" fichier sera ajouté à l'index, vous n'avez donc besoin que d'une seule commande:

 [/cfgdev/python (buildServer) dbg]$ git mv application.py newApplication.py
[/cfgdev/python (buildServer) dbg]$ git status
# On branch buildServer
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    application.py -> newApplication.py
 

Et un commit bien sur ..

32voto

Mark Longair Points 93104

Dans chaque commit, git enregistre l'état de votre arborescence des sources, plutôt que de savoir si il y avait un changement de nom (ou autre) qui a produit cet état. Donc, si vous venez de renommer un fichier normalement (plutôt qu'avec git mv), la sortie d' git status sera quelque chose comme:

# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    foo.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   bar.txt
no changes added to commit (use "git add" and/or "git commit -a")

Si vous décidez que vous voulez enregistrer l'état de l'arbre avec le fichier renommé, vous pouvez préparer ce changement avec:

 git rm foo.txt
 git add bar.txt

... puis, git status vais vous montrer:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    foo.txt -> bar.txt

... et on ne peut s'engager qu'avec git commit comme d'habitude:

git commit -m "Renamed foo.txt to bar.txt"

Le point important est de garder à l'esprit est que lorsque git vous indique qu'un fichier a été renommé lorsque vous affichez l'histoire, c'est parce qu'il a travaillé que renommer, il s'est passé en comparant l'état de l'arbre à partir d'une version à l'autre - il ne veut pas dire qu'une opération de changement de nom a été enregistré dans l'histoire.

10voto

Derek Mahar Points 7125

Comme les réponses précédentes ont expliqué, Git tire un fichier renommer l'opération depuis le changement de contenu dans votre arborescence des sources. Pour enregistrer une opération de changement de nom, Git stocke à la fois un supprimer et ajouter de l'opération, et non de l'opération renommer lui-même.

Comme Magnus Skog a souligné git mv <filename1> <filename2> indique à Git pour ajouter le contenu en <filename1> de <filename2> et retirez <filename1> à partir de l'arborescence de fichiers.

En tant que Marque Longair expliqué, si, au lieu de git mv, vous utilisez la commande shell mv <filename1> <filename2>, Git ne détecte pas l'opération de changement de nom jusqu'à ce que vous appelez git rm <filename1> et git add <filename2>.

Cependant, une autre façon de dire à Git sur les opérations de renommage avec mv est d'utiliser git add --all. Cette commande indique à Git de détecter et de se préparer à commettre tous les fichiers dans votre espace de travail qui diffèrent de celles du référentiel, y compris ceux que vous avez renommé:

$ ls
a  b  c  d
$ mv d e
$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    d
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   e
no changes added to commit (use "git add" and/or "git commit -a")
$ git add --all
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    d -> e
#

git add --all est un moyen très pratique pour commettre un grand nombre de fichiers que vous avez renommé dans votre espace de travail à l'aide d'un script ou en renommant l'outil, par exemple.

1voto

PAntoine Points 523

git mv

Cela conserve l'historique et déplace le fichier. Besoin de faire un commit par la suite pour que le repo soit à jour.

Git récupérera également les fichiers déplacés dans le système de fichiers lors de la validation (parfois) et génère parfois un faux positif lorsqu'un fichier est supprimé et qu'un nouveau fichier (mais similaire) est créé.

Il déplacera également le fichier dans le système de fichiers (cette option peut être remplacée). Donc pas besoin de faire un git add

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