2010-02-06 15 views
29

Staram:Jak przenieść wiele plików w git?

git mv a.py b.py src/

i dostać

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

Korzystanie z -n flagę, tak jak git mv -n a.py b.py src/ daje mi:

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 

robię coś naprawdę głupi? Używam git w wersji 1.6.6.1

+0

powinienem chyba powiedzieć, że biegnę GIT DarwinPorts (wersja 1.6.6.1) na zasadzie prochowiec. –

Odpowiedz

21

ten został naprawiony w obecnej głównej gałęzi git, to w v1.7.0-RC0 ale nie w kompilacji uwalniania jeszcze.

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

Tymczasem najprostszą rzeczą do zrobienia jest albo git mv pliki pojedynczo lub po prostu użyć mv a następnie ręcznie zaktualizować indeks, na przykład z git add -A, jeśli masz odpowiednie wzory .gitignore.

+0

Brakowało mi - jako przełącznika do Dodaj, bardzo przydatnego :) – Pondidum

+0

git add ./ Działa również! Ale jeszcze lepiej jest, że przynajmniej w wersji 1.9 git i później, możliwość przenoszenia wielu plików na raz działa zupełnie dobrze. – Kzqai

12

Dopóki nie ma żadnych innych zmian w katalogu roboczym, najprostszym sposobem jest przeniesienie ich samemu, a następnie użycie git add -A. Oto:

$ 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

Nie mogę powiedzieć, że to dobrze, ale nigdy nie użyłem 'git rm' - po prostu przenieś pliki i dodaj tell' git', aby dodać je później. Dobrą rzeczą jest, że 'git' rozpoznaje je jako te same pliki. – phunehehe

+0

Dzięki, to działało dla mnie w systemie Windows! – Schmuli

8

działa na mnie:

$ 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

To dziwne, to nie działa w 1.6.6 dla mnie. –

+0

Spróbuję z nowszą wersją – wich

+0

Działa dla mnie w wersji git 1.7.9. Możesz również użyć symboli wieloznacznych 'git mv [abcd] bar /' (chociaż myślę, że powłoka je rozszerza, więc git widzi to samo, co jego rozwiązanie.) – idbrii

18

Używam bash pętlę:

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

Czy można to zmienić, aby zmienić nazwę, na przykład wszystkie 'a_1_b.ext' ->' a_2_b.ext'? – Leo

8

w Windows (posh ~ git):

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

Dziękujemy, możesz użyć przełącznika -n, aby sprawdzić, czy zadziała (tak zwany dry-run). Przydatny. Czy ktoś wie, jak to zrobić z SourceTree? Nie mogę tam znaleźć polecenia. –

Powiązane problemy