commande git pour déplacer un dossier dans un autre


194

J'ai créé un dossier commonavec un tas de fichiers et de dossiers source.

Maintenant, je veux déplacer le commondossier dans le includedossier pour qu'il ressemble àinclude/common

J'ai essayé ceux-ci:

  1. git add include

  2. git mv common/ include/

    mais cela échoue avec cette erreur

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

  3. J'ai essayé git mv common/ include/commonmais j'obtiens la même erreur

Une idée comment y parvenir?

Réponses:


177

L'une des choses les plus intéressantes à propos de git est que vous n'avez pas besoin de suivre explicitement les noms de fichiers. Git le comprendra en comparant le contenu des fichiers.

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

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

Running git statusdevrait vous montrer quelque chose comme ceci:

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

44
Cela ne fonctionne pas pour moi (avec Windows 7, 1.7.6.msysgit.0). Git pense que les anciens fichiers ont été supprimés et que de nouveaux fichiers ont été ajoutés.
Bart

Hmm, peut-être que git utilise un utilitaire externe pour déterminer la similitude des fichiers qui ne fonctionne pas sous Windows? C'était un élément central de l'implémentation de git.
Andres Jaan Tack

13
@OliverF. Correction: git mvest équivalent.
Andres Jaan Tack

25
"L'une des plus belles choses à propos de git" - l'un des inconvénients de cette fonctionnalité intéressante est qu'elle commence à échouer lorsque vous modifiez également le fichier qui a été renommé dans une large mesure, ce qui lui fait voir une suppression et l'ajout d'un nouveau fichier , donc franchement, je préférerais plutôt un support de renommage explicite.
Erik Kaplun

2
Si git convertit les fins de ligne, cela entraîne le problème décrit par @Bart. Pour que cela fonctionne, vous devez faire ce qui suit: git config --global core.autocrlf false
Mariano Dupont

164
 git mv common include

devrait marcher.

Depuis la git mvpage de manuel :

git mv [-f] [-n] [-k] <source> ... <destination directory>

Dans la seconde 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 une fois terminé, mais la modification doit toujours être validée.

Aucun " git add" ne doit être fait avant le déménagement.


Remarque: " git mv A B/", lorsqu'il Bn'existe pas en tant que répertoire, devrait afficher une erreur, mais ce n'est pas le cas.

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

Git avait l'habitude de couper la barre oblique de fin et de rendre la commande équivalente à ' git mv file no-such-dir', qui a créé le fichier no-such-dir(alors que la barre oblique de fin indiquait explicitement qu'il ne pouvait s'agir que d'un répertoire).

Ce correctif ignore la suppression de la barre oblique finale pour le chemin de destination.
Le chemin avec sa barre oblique de fin est passé à renommer (2), qui génère des erreurs avec le message approprié:

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

2
A parfaitement fonctionné - et l'utilisation git mvsemble être une bien meilleure approche!
Tomas Petricek

23

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, il y a eu des renoms dans le répertoire source et donc git mvne peut pas trouver le fichier attendu.

La solution est simple: il vous suffit de vous engager avant de postuler git mv.


15

Assurez-vous d'avoir ajouté toutes vos modifications à la zone de préparation avant d'exécuter

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, je viens de le découvrir.


"s'il y a des fichiers non ajoutés, alors je viens de le découvrir." - Merci!
cacoder le

3

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

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


Attention: s'il y a un espace dans votre nom de dossier / fichier, cela posera des problèmes!
dejoma

3

J'ai eu un problème similaire avec l' git mvendroit où je voulais déplacer le contenu d'un dossier dans un dossier existant, et je me suis retrouvé 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 commondossier) archivés dans git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Créez un nouveau dossier dans le includedossier, avec la même structure de répertoires quecommon
  • git mv $f $newdir/$(basename "$f"): Déplacez 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 qu'il échouera également si vous essayez de déplacer un fichier dans un dossier inexistant (par conséquent mkdir -p).

L'avantage de cette approche est qu'elle ne touche que les fichiers qui sont déjà enregistrés dans git. En utilisant simplement git mvpour déplacer un dossier entier, et le dossier contient des modifications non organisées, git ne saura pas quoi faire.

Après avoir déplacé les fichiers, vous voudrez peut-être nettoyer le référentiel pour supprimer toutes les modifications non mises en scène restantes - n'oubliez pas de commencer par exécuter à sec!

git clean -fd -n

Attention: s'il y a un espace dans votre nom de dossier / fichier, cela posera des problèmes!
dejoma

2

Je suis désolé de ne pas avoir 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 eu la même erreur: faites attention

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

Cela peut entraîner que vous ne verrez pas l'historique git de votre projet dans un 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 la vieille histoire de git dans mon projet. Au moins mon projet n'est pas perdu. Maintenant, j'ai mon projet dans newFolderName, mais sans l'historique (

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


Assurez-vous que toutes vos modifications ont été ajoutées. Git ne dit pas "mauvaise source" s'il y a des changements non ajoutés, donc je viens de le découvrir.
Kevin Pluck

0

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 subdir- dossier , donc l'objectif était:

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 que je souhaitais déplacer: mkdir tmpdir && mv a b tmpdir
  • extrait d'anciens fichiers git checkout a b
  • a créé un nouveau répertoire et déplacé des dossiers propres (sans fichiers non suivis) vers un nouveau sous-répertoire: mkdir subdir && mv a b subdir
  • ajouté tous les fichiers du sous-répertoire (donc Git ne pouvait ajouter que les fichiers précédemment suivis - c'était en quelque sorte git add --updateavec une astuce de changement de répertoire ): git add subdir(normalement cela ajouterait même des fichiers non suivis - cela nécessiterait de créer un .gitignorefichier)
  • git status affiche maintenant uniquement les fichiers déplacés
  • déplacé le reste des fichiers de tmpdir vers sous-répertoire: mv tmpdir/* subdir
  • git statuson dirait que nous avons exécuté git mv:)

-1

J'ai résolu cela sur Windows en faisant ceci:

  • Ouvrez la console Power Shell
  • exécuter dir
  • Cliquez sur Alt et faites glisser sur la colonne de nom de fichier / dossier, puis copiez
  • Coller dans le bloc-notes ++
  • exécuter remplacer par regex: remplacer (.*)pargit mv ".\\\1" ".\\<New_Folder_Here>\"
  • copier tout le texte de notepad ++ dans PowerShell
  • appuyez sur Entrée
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.