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é en tant que modification ou un fichier “perdu” devra-t-il être supprimé et le nouveau fichier devra ensuite être ajouté avec git add ?

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:

 $ git mv application.py newApplication.py $ git status # On branch buildServer # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # renamed: application.py -> newApplication.py 

Et un engagement bien sûr ..

Dans chaque validation, git enregistre l’état de votre arborescence source, plutôt que de savoir s’il y a eu un renommage (ou autre) ayant généré cet état. Donc, si vous renommez un fichier normalement (plutôt qu’avec git mv ), le résultat de git status sera comme suit:

 # On branch master # Changed but not updated: # (use "git add/rm ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # deleted: foo.txt # # Untracked files: # (use "git add ..." 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 ensuite d’enregistrer l’état de l’arborescence avec ce fichier renommé, vous pouvez procéder à cette modification avec:

  git rm foo.txt git add bar.txt 

… alors le git status vous montrera:

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

… et vous pouvez commettre cela avec git commit comme d’habitude:

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

L’important est de garder à l’esprit que lorsque git vous dit qu’un fichier a été renommé lorsque vous visualisez l’historique, c’est parce qu’il a bien compris que le renommage doit avoir eu lieu en comparant l’état de l’arbre d’une version à l’autre – ne signifie pas qu’une opération de renommage a été enregistrée dans l’histoire.

Comme les réponses précédentes l’ont expliqué, Git dérive une opération de changement de nom de fichier à partir du changement de contenu dans votre arborescence source. Pour enregistrer une opération de renommage, Git stocke à la fois une opération de suppression et une opération d’ajout, et non l’opération de renommage elle-même.

Comme Magnus Skog l’a souligné, git mv indique à Git d’append le contenu de à et de supprimer de l’arborescence de fichiers.

Comme Mark Longair l’a expliqué , si au lieu de git mv , vous utilisez la commande shell mv , Git ne détectera pas l’opération de renommage tant que vous n’aurez pas appelé git rm et git add .

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

 $ ls abcd $ mv de $ git status # On branch master # Changed but not updated: # (use "git add/rm ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # deleted: d # # Untracked files: # (use "git add ..." 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 ..." to unstage) # # renamed: d -> e # 

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

git mv

Cela conserve l’historique et déplace le fichier. Vous devez ensuite faire un commit pour que le repository soit à jour.

Git récupérera également les fichiers qui sont 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 (cela peut être remplacé). Donc pas besoin de faire un git add