2010-02-06 26 views
29

tôi cố gắng:Làm thế nào để bạn di chuyển nhiều tệp trong git?

git mv a.py b.py src/

và nhận

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

Sử dụng cờ -n, như vậy git mv -n a.py b.py src/ mang lại cho tôi:

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 

Tôi có làm một cái gì đó thực sự ngốc nghếch? Tôi đang sử dụng phiên bản git 1.6.6.1

+0

tôi có lẽ nên nói rằng tôi đang chạy macports git (phiên bản 1.6.6.1) trên một mac. –

Trả lời

21

này đã được cố định tại các chi nhánh chủ hiện tại của git, nó ở v1.7.0-RC0 nhưng không phải trong một thông cáo xây dựng được nêu ra.

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

Trong lúc này là điều đơn giản nhất để làm là một trong hai git mv các tập tin cá nhân hoặc chỉ sử dụng mv và sau đó cập nhật các chỉ số bằng tay, ví dụ với git add -A nếu bạn có các mẫu .gitignore thích hợp.

+0

Tôi đã bỏ lỡ -A như một công tắc để Thêm, rất hữu ích :) – Pondidum

+0

git add ./ Cũng hoạt động! Nhưng thậm chí tốt hơn là ít nhất là trong phiên bản git 1.9 và sau đó, khả năng di chuyển nhiều tệp cùng lúc hoạt động hoàn toàn tốt. – Kzqai

12

Miễn là không có bất kỳ thay đổi nào khác trong thư mục hoạt động, cách đơn giản nhất là chỉ di chuyển chúng và sau đó sử dụng git add -A. Kìa:

$ 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

Tôi không thể nói nó tốt, nhưng tôi chưa bao giờ sử dụng 'git rm' - chỉ cần di chuyển các tập tin và thêm' git' để thêm chúng sau này. Điều tốt là, 'git' không nhận ra chúng là những tập tin giống nhau. – phunehehe

+0

Cảm ơn, điều này đã làm việc cho tôi trên Windows! – Schmuli

8

trình cho tôi:

$ 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

Thật kỳ lạ, nó không hoạt động trong 1.6.6 cho tôi. –

+0

Tôi sẽ thử phiên bản mới hơn – wich

+0

Hoạt động với tôi ở phiên bản git 1.7.9. Bạn cũng có thể sử dụng các ký tự đại diện 'git mv [abcd] bar /' (mặc dù tôi nghĩ rằng shell mở rộng chúng, vì vậy git thấy nó giống như giải pháp của wich. – idbrii

18

tôi sử dụng vòng lặp bash:

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

Điều này có thể được sửa đổi để đổi tên ví dụ tất cả 'a_1_b.ext' ->' a_2_b.ext'? – Leo

8

Trong Windows (posh ~ git):

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

Cảm ơn bạn, bạn có thể sử dụng công tắc -n để kiểm tra xem nó có hoạt động hay không (cái gọi là chạy khô). Hữu ích. Có ai biết làm thế nào để làm điều này từ SourceTree? Tôi không thể tìm thấy lệnh ở đó. –

Các vấn đề liên quan