2010-02-06 15 views
29

Trato:¿Cómo mueves varios archivos en git?

git mv a.py b.py src/

y obtener

fatal: multiple sources for the same target, source=b.py, destination=src/b.py

Usando la bandera -n, al igual que git mv -n a.py b.py src/ me da:

Checking rename of 'a.py' to 'src/b.py' 
Checking rename of 'b.py' to 'src/b.py' 
fatal: multiple sources for the same target, source=b.py, destination=src/b.py 

¿Estoy haciendo algo realmente ¿estúpido? Estoy usando la versión de Git 1.6.6.1

+0

Probablemente debería decir que estoy ejecutando el git macports (versión 1.6.6.1) en una Mac. –

Respuesta

21

Esto se ha corregido en la rama principal actual de git, está en v1.7.0-rc0 pero no en una versión de lanzamiento todavía.

http://git.kernel.org/?p=git/git.git;a=commit;h=af82559b435aa2a18f38a4f47a93729c8dc543d3

Por el momento la cosa más simple que hacer es o bien git mv los archivos de forma individual o simplemente para utilizar mv y luego actualizar el índice manualmente, por ejemplo, con git add -A si tiene patrones apropiados de .gitignore.

+0

Me había perdido -A como un cambio a Agregar, muy útil :) – Pondidum

+0

git add ./ ¡También funciona! Pero aún mejor es que al menos en la versión 1.9 y posterior de git, la capacidad de mover varios archivos a la vez funciona perfectamente bien. – Kzqai

12

Siempre y cuando no haya ningún otro cambio en el directorio de trabajo, la forma más sencilla es simplemente moverlos usted mismo y luego usar git add -A. He aquí:

$ ls 
a.py b.py 
$ mkdir src 
$ mv *.py src 
$ git status 
# Changed but not updated: 
#  deleted: a.py 
#  deleted: b.py 
# Untracked files: 
#  src/ 
$ git add -A 
$ git status 
# Changes to be committed: 
#  renamed: a.py -> src/a.py 
#  renamed: b.py -> src/b.py 
+1

No puedo decir que sea bueno, pero nunca he usado 'git rm', simplemente mueva los archivos y agregue tell' git' para agregarlos luego. Lo bueno es que 'git' los reconoce como los mismos archivos. – phunehehe

+0

¡Gracias, esto funcionó para mí en Windows! – Schmuli

8

Obras para mí:

$ git --version 
git version 1.6.4.1 
$ mkdir foo 
$ cd foo 
$ git init 
Initialized empty Git repository in /home/wich/foo 
$ touch a b c d 
$ git add a b c d 
$ git commit -m "foobar" 
[master (root-commit) 11051bd] foo 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 a 
create mode 100644 b 
create mode 100644 c 
create mode 100644 d 
$ mkdir bar 
$ git mv a b c d bar 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: a -> bar/a 
#  renamed: b -> bar/b 
#  renamed: c -> bar/c 
#  renamed: d -> bar/d 
# 
+0

Eso es raro, no funciona en 1.6.6 para mí. –

+0

Lo intentaré con una versión más reciente – wich

+0

Funciona para mí en la versión de Git 1.7.9. También podría usar comodines 'git mv [abcd] bar /' (aunque creo que el shell los expande, por lo que git lo ve igual que la solución. – idbrii

18

utilizo bucle de bash:

for FILE in src/*.h; do git mv $FILE include/; done
+0

¿Se puede modificar para cambiar el nombre, por ejemplo, todos 'a_1_b.ext' ->' a_2_b.ext'? – Leo

8

En Windows (~ elegante GIT):

foreach ($file in get-childitem *.py) { git mv $file.name ./src } 
+0

Gracias, puede usar el modificador -n para probar si funcionaría (lo que se conoce como ejecución en seco). Útil. ¿Alguien sabe cómo hacer esto desde SourceTree? No puedo encontrar el comando allí. –