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?

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
#

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

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.


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.


"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;


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

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.


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:)

-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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.