comando git para mover una carpeta dentro de otra

193

He creado una carpeta commoncon un montón de archivos y carpetas de origen.

Ahora quiero mover la commoncarpeta a la includecarpeta para que parezcainclude/common

Probé estos:

  1. git add include

  2. git mv common/ include/

    pero falla con este error

    fatal: mala fuente, fuente = myrepo / común, destino = myrepo / include

  3. Lo intenté git mv common/ include/commonpero me sale el mismo error

¿Alguna idea de cómo lograr esto?

acechador
fuente

Respuestas:

177

Una de las mejores cosas de git es que no es necesario realizar un seguimiento explícito del cambio de nombre de los archivos. Git lo resolverá comparando el contenido de los archivos.

Entonces, en su caso, no trabaje tan duro:

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

Correr git statusdebería mostrarte algo como esto:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#
Andres Jaan Tack
fuente
43
Esto no funciona para mí (usando Windows 7, 1.7.6.msysgit.0). Git cree que los archivos antiguos se eliminaron y se agregaron archivos nuevos.
Bart
Hmm, ¿quizás git usa alguna utilidad externa para determinar la uniformidad del archivo que no funciona en Windows? Esta fue una pieza central de la implementación de git.
Andres Jaan Tack
13
@OliverF. Corrección: git mves equivalente.
Andres Jaan Tack
25
"Una de las cosas más bonitas de git" : una de las desventajas de esta buena característica es que comienza a fallar cuando también modifica el archivo que se renombró en gran medida, lo que hace que vea la eliminación y la adición de un nuevo archivo , francamente, preferiría el soporte explícito de cambio de nombre en su lugar.
Erik Kaplun
2
Si git convierte las terminaciones de línea, esto genera el problema descrito por @Bart. Para que esto funcione, debe hacer lo siguiente: git config --global core.autocrlf false
Mariano Dupont
162
 git mv common include

Deberia trabajar.

Desde la git mvpágina del manual :

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

En la segunda forma, el último argumento tiene que ser un directorio existente; las fuentes dadas se moverán a este directorio .
El índice se actualiza después de completarse con éxito, pero el cambio aún debe confirmarse.

No se git adddebe hacer " " antes del traslado.


Nota: " git mv A B/", cuando Bno existe como directorio, debería producirse un error, pero no fue así.

Ver commit c57f628 por Matthieu Moy ( moy) para Git 1.9 / 2.0 (Q1 2014):

Git solía recortar la barra diagonal final y hacer que el comando sea equivalente a ' git mv file no-such-dir', que creó el archivo no-such-dir(mientras que la barra diagonal final indicaba explícitamente que solo podía ser un directorio).

Este parche omite la eliminación de la barra diagonal final para la ruta de destino.
La ruta con su barra inclinada final se pasa a renombrar (2), que se equivoca con el mensaje apropiado:

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory
VonC
fuente
2
Funcionó perfectamente, ¡y usar git mvparece un enfoque mucho mejor!
Tomas Petricek
23

Mando:

$ git mv oldFolderName newFolderName

Por lo general funciona bien.

El error "fuente incorrecta ..." generalmente indica que después de la última confirmación hubo algunos cambios de nombre en el directorio fuente y, por git mvlo tanto , no puede encontrar el archivo esperado.

La solución es simple: solo confirme antes de aplicar git mv.

Igor Zvorygin
fuente
15

Asegúrese de haber agregado todos sus cambios al área de preparación antes de ejecutar

git mv oldFolderName newFoldername

git falla con error

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

si hay archivos sin agregar, así que acabo de enterarme.

Kevin Pluck
fuente
"si hay archivos sin agregar, entonces me acabo de enterar". - ¡Gracias!
cacoder
3

Otra forma de mover todos los archivos de un directorio a un subdirectorio (mantiene el historial de git):

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

Michael Smolenski
fuente
3

Tuve un problema similar con el lugar git mvdonde quería mover el contenido de una carpeta a una carpeta existente, y terminé con este 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

Explicación

  • git ls-files: Encuentra todos los archivos (en la commoncarpeta) registrados en git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Cree una nueva carpeta dentro de la includecarpeta, con la misma estructura de directorios quecommon
  • git mv $f $newdir/$(basename "$f"): Mueva el archivo a la carpeta recién creada

La razón para hacerlo es que git parece tener problemas para mover archivos a carpetas existentes, y también fallará si intenta mover un archivo a una carpeta no existente (por lo tanto mkdir -p).

Lo bueno de este enfoque es que solo toca archivos que ya están registrados en git. Simplemente usando git mvpara mover una carpeta completa, y la carpeta contiene cambios no organizados, git no sabrá qué hacer.

Después de mover los archivos, es posible que desee limpiar el repositorio para eliminar cualquier cambio restante no organizado, ¡solo recuerde ejecutar en seco primero!

git clean -fd -n
loket
fuente
2

Lo siento, no tengo suficiente reputación para comentar la "respuesta" de "Andres Jaan Tack".

Creo que mi mensaje se eliminará ((pero solo quiero advertir a "Lurscher" y otros que obtuvieron el mismo error: tenga cuidado al hacer

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

Puede causar que no vea el historial de git de su proyecto en una nueva carpeta.

lo intenté

$ git mv oldFolderName newFolderName

tiene

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

yo hice

git rm -r oldFolderName

y

git add newFolderName

y no veo la vieja historia de git en mi proyecto. Al menos mi proyecto no está perdido. Ahora tengo mi proyecto en newFolderName, pero sin el historial (

Solo quiero advertir, tenga cuidado al usar el consejo de "Andres Jaan Tack", si no quiere perder su historia.

Ivan F.
fuente
Asegúrese de que se hayan agregado todos sus cambios. Git no dice "mala fuente" si hay cambios no agregados, así que me acabo de enterar.
Kevin Pluck
0

Tuve un problema similar, pero en la carpeta que quería mover tenía archivos que no estaba rastreando.

digamos que tenía archivos

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

Y quería mover solo los archivos rastreados a la subcarpeta subdir, por lo que el objetivo era:

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

lo que hice fue:

  • Creé una nueva carpeta y moví todos los archivos que estaba interesado en mover: mkdir tmpdir && mv a b tmpdir
  • desprotegido archivos antiguos git checkout a b
  • creó un nuevo directorio y movió carpetas limpias (sin archivos sin seguimiento) a una nueva subdirección: mkdir subdir && mv a b subdir
  • agregó todos los archivos del subdirectorio (por lo que Git podría agregar solo los archivos rastreados anteriormente, fue algo así como git add --updatecon el truco de cambio de directorio ): git add subdir(normalmente esto agregaría incluso los archivos no rastreados, esto requeriría crear el .gitignorearchivo)
  • git status muestra ahora solo archivos movidos
  • movió el resto de archivos de tmpdir a subdir: mv tmpdir/* subdir
  • git statusparece que ejecutamos git mv:)
test30
fuente
-1

Resolví esto en Windows haciendo esto:

  • Consola Power Shell abierta
  • ejecutar dir
  • Alt-clic y arrastre sobre la columna del nombre del archivo / carpeta, luego copie
  • Pegar en el bloc de notas ++
  • ejecutar reemplazar con regex: reemplazar (.*)congit mv ".\\\1" ".\\<New_Folder_Here>\"
  • copie todo el texto desde notepad ++ en powershell
  • Pulsa Enter
FalcoGer
fuente