Commande git pour déplacer un dossier dans un autre

J’ai créé un dossier common avec un tas de fichiers et de dossiers sources.

Maintenant, je veux déplacer le dossier common dans le dossier include afin qu’il ressemble à include/common

J’ai essayé ces:

  1. git add include

  2. git mv common/ include/

    mais il échoue avec cette erreur

    fatal: mauvaise source, source = myrepo / common, destination = myrepo / include

  3. J’ai essayé git mv common / include / common mais j’ai la même erreur

Une idée de comment y parvenir?

Une des plus belles choses à propos de git est que vous n’avez pas besoin de suivre explicitement les noms de fichiers. Git va le découvrir en comparant le contenu des fichiers.

Donc, dans votre cas, ne travaillez pas si fort:

 $ mkdir include $ mv common include $ git rm -r common $ git add include/common 

En cours d’exécution git status devrait vous montrer quelque chose comme ceci:

 $ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # renamed: common/file.txt -> include/common/file.txt # 
  git mv common include 

devrait marcher.

Depuis la page de manuel de git mv :

 git mv [-f] [-n] [-k]  ...  

Dans la deuxième forme, le dernier argument doit être un répertoire existant; les sources données seront déplacées dans ce répertoire .
L’index est mis à jour après la réussite, mais la modification doit toujours être validée.

Aucun ” git add ” ne devrait être fait avant le déménagement.


Remarque: ” git mv AB/ “, lorsque B n’existe pas en tant que répertoire, doit contenir une erreur, mais ce n’est pas le cas.

Voir commit c57f628 par Matthieu Moy ( moy ) pour Git 1.9 / 2.0 (T1 2014):

Git servait à couper la barre oblique finale, et à rendre la commande équivalente à « git mv file no-such-dir », qui créait le fichier no-such-dir (tandis que la barre oblique indiquait explicitement qu’il ne pouvait s’agir que d’un répertoire).

Ce correctif ignore le retrait de la barre oblique finale pour le chemin de destination.
Le chemin avec sa barre oblique finale est passé à renommer (2), ce qui entraîne une erreur avec le message approprié:

 $ git mv file no-such-dir/ fatal: renaming 'file' failed: Not a directory 

Commander:

 $ git mv oldFolderName newFolderName 

Cela fonctionne généralement bien.

L’erreur “mauvaise source …” indique généralement qu’après la dernière validation, le répertoire source git mv et que git mv ne peut donc pas trouver le fichier attendu.

La solution est simple – validez simplement avant d’appliquer git mv .

Assurez-vous d’avoir ajouté toutes vos modifications à la zone de mise en attente avant de lancer

 git mv oldFolderName newFoldername 

git échoue avec une erreur

 fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo 

s’il y a des fichiers non ajoutés, alors je viens de découvrir.

Une autre façon de déplacer tous les fichiers d’un répertoire vers un sous-répertoire (conserve l’historique git):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;

J’ai eu un problème similaire avec git mv où je voulais déplacer le contenu d’un dossier dans un dossier existant, et j’ai fini avec ce script “simple”:

 pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd 

Explication

  • git ls-files : Trouver tous les fichiers (dans le dossier common ) archivés dans git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir; : Créez un nouveau dossier dans le dossier include , avec la même structure de répertoires
  • git mv $f $newdir/$(basename "$f") : déplace le fichier dans le dossier nouvellement créé

La raison en est que git semble avoir des problèmes pour déplacer des fichiers dans des dossiers existants, et il échouera également si vous essayez de déplacer un fichier dans un dossier non existant (donc mkdir -p ).

La bonne chose à propos de cette approche est qu’elle ne touche que les fichiers déjà archivés pour git. En utilisant simplement git mv pour déplacer un dossier entier et que le dossier contient des modifications non planifiées, git ne saura pas quoi faire.

Après avoir déplacé les fichiers, vous souhaiterez peut-être nettoyer le référentiel pour supprimer les modifications non encore implémentées – rappelez-vous simplement de commencer par le séchage!

 git clean -fd -n 

Je suis désolé je n’ai pas assez de réputation pour commenter la “réponse” de “Andres Jaan Tack”.

Je pense que mon message sera supprimé ((mais je veux juste avertir “lurscher” et les autres qui ont la même erreur: faire attention

 $ mkdir include $ mv common include $ git rm -r common $ git add include/common 

Il se peut que vous ne voyiez pas l’historique de git de votre projet dans le nouveau dossier.

j’ai essayé

 $ git mv oldFolderName newFolderName 

eu

 fatal: bad source, source=oldFolderName/somepath/__init__.py, dest ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py 

J’ai fait

 git rm -r oldFolderName 

et

 git add newFolderName 

et je ne vois pas l’histoire des vieux git dans mon projet. Au moins mon projet n’est pas perdu. J’ai maintenant mon projet dans newFolderName, mais sans l’historique (

Je veux juste vous avertir, soyez prudent en utilisant les conseils de “Andres Jaan Tack”, si vous ne voulez pas perdre votre histoire git.

J’ai eu un problème similaire, mais dans le dossier que je voulais déplacer, j’avais des fichiers que je ne suivais pas.

disons que j’avais des fichiers

 a/file1 a/untracked1 b/file2 b/untracked2 

Et je voulais déplacer uniquement les fichiers suivis vers le sous-dossier du sous- subdir , l’objective était donc:

 subdir/a/file1 subdir/a/untracked1 subdir/b/file2 subdir/b/untracked2 

ce que j’avais fait était:

  • J’ai créé un nouveau dossier et déplacé tous les fichiers qui m’intéressaient: mkdir tmpdir && mv ab tmpdir
  • vérifié les anciens fichiers git checkout ab
  • créé un nouveau répertoire et déplacé des dossiers propres (sans fichiers non suivis) vers un nouveau sous-répertoire: mkdir subdir && mv ab subdir
  • ajout de tous les fichiers de subdir (Git pouvait donc append seulement des fichiers suivis auparavant – c’était une sorte de git add --update avec un astuce de changement de répertoire): git add subdir
  • git status affiche maintenant seulement les fichiers déplacés
  • a déplacé le rest des fichiers de tmpdir en sous-répertoire: mv tmpdir/* subdir
  • git status ressemble à celui que nous avons exécuté git mv 🙂