2010-10-10 7 views
133

J'ai créé un dossier common avec un tas de fichiers et de dossiers source.commande git pour déplacer un dossier à l'intérieur d'un autre

Maintenant, je veux déplacer le dossier common dans le dossier include il ressemble include/common

J'ai essayé ces:

  1. git add include

  2. git mv common/ include/

    mais échoue avec cette erreur

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

  3. J'ai essayé git mv commun/Include/commune mais je reçois la même erreur

Toute idée comment y parvenir?

Répondre

148

L'une des choses les plus agréables git est que vous n'avez pas besoin de suivre renomme le fichier explicitement. Git va le comprendre en comparant le contenu des fichiers.

Ainsi, dans votre cas, ne fonctionnent pas si difficile:

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

Courir git status devrait 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 
# 
+24

Cela ne fonctionne pas pour moi (en utilisant 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

+0

Hmm, peut-être git utilise un utilitaire externe pour déterminer l'identité des fichiers qui ne fonctionne pas sous Windows? C'était une pièce maîtresse de la mise en œuvre de git. –

+41

L'utilisation de la commande 'git mv' est la meilleure façon de le faire. – Oliver

109
git mv common include 

devrait fonctionner.

De l'git mv man page:

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

In the second form, the last argument has to be an existing directory; the given sources will be moved into this directory.
The index is updated after successful completion, but the change must still be committed.

Non "git add" devrait être fait avant le déménagement.


Note: "git mv A B/", quand B n'existe pas un répertoire, si l'erreur, mais il n'a pas.

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

Git used to trim the trailing slash, and make the command equivalent to ' git mv file no-such-dir ', which created the file no-such-dir (while the trailing slash explicitly stated that it could only be a directory).

This patch skips the trailing slash removal for the destination path.
The path with its trailing slash is passed to rename(2), which errors out with the appropriate message:

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

Travaillé parfaitement - et l'utilisation de 'git mv' semble une bien meilleure approche! –

0

J'ai eu le même problème, mais dans le dossier que je 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 seulement objet d'un suivi des fichiers à sous-dossier subdir, de sorte que 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 voulais déplacer: mkdir tmpdir && mv a b tmpdir
  • cochés sur les anciens fichiers git checkout a b
  • créé nouveau répertoire et déplacé des dossiers propres (sans fichiers trassez) à nouveau subdir: mkdir subdir && mv a b subdir
  • ajouté tous les fichiers de subdir (donc Git pourrait ajouter seulement suivi les fichiers précédemment - il était somekind de git add --update avec changement de répertoire trick): git add subdir (normalement cela ajouterait même des fichiers non suivis - cela nécessiterait la création du fichier .gitignore)
  • git status montre maintenant seulement déplacé des fichiers
  • déplacé reste de fichiers de tmpdir à subdir: mv tmpdir/* subdir
  • git status semble que nous git mv :) exécuté
2

Je suis désolé, je n'ai pas assez réputation pour commenter la « réponse » de « Andres Jaan Tack ».

Je pense que mon messege sera supprimé (( Mais je veux juste avertir « lurscher » et d'autres qui ont obtenu la même erreur: être carefull faire

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

Il peut provoquer vous ne verrez pas le git histoire de votre projet dans le nouveau dossier.

I tryed

$ git mv oldFolderName newFolderName 

obtenu

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 ancienne git dans mon projet. Au moins, mon projet n'est pas perdu. Maintenant, j'ai mon projet newFolderName, mais sans l'histoire (

veux juste avertir, soyez prudent en utilisant des conseils de « Andres Jaan Tack », si vous ne voulez pas perdre votre hsitory git

+0

Assurez-vous que toutes vos modifications ont été ajoutées. Git échoue à dire "mauvaise source" s'il y a des changements non rajoutés, donc je viens de le découvrir. –

11

commande:.

$ git mv oldFolderName newFolderName 

Il fonctionne généralement bien.

erreur « mauvaise source ...»Indique généralement que, après la dernière validation, il y avait quelques renommages dans le répertoire source et donc git mv ne peut pas trouver le fichier attendu

La solution est simple -. Simplement engager avant d'appliquer git mv

3

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

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

6

Assurez-vous que vous avez ajouté tous vos changements à la zone de transit avant d'exécuter

git mv oldFolderName newFoldername 

git échoue avec l'erreur

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

s'il y a des fichiers unadded, donc je viens de découvrir.

+0

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

3

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 a 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) vérifié dans git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Faire un nouveau dossier dans le dossier include, avec la même structure de répertoire que common
  • git mv $f $newdir/$(basename "$f"): déplacer le fichier dans le dossier nouvellement créé

La raison pour cela est que git semble avez des problèmes pour déplacer des fichiers dans des dossiers existants, et cela échouera également si vous essayez de déplacer un fichier dans un dossier inexistant (d'où mkdir -p).

La bonne chose à propos de cette approche est qu'elle seulement touche les fichiers qui sont déjà archivés à git. En utilisant simplement git mv pour déplacer un dossier entier, et le dossier contient des changements non-stabilisés, git ne saura pas quoi faire. Après avoir déplacé les fichiers, vous pourriez vouloir clean the repository pour supprimer tous les changements non-stagnants restants - rappelez-vous simplement d'exécuter à sec d'abord!

git clean -fd -n 
Questions connexes