Git: sao chép tất cả các tệp trong một thư mục từ một nhánh khác


188

Làm cách nào để sao chép tất cả các tệp trong một thư mục từ một chi nhánh khác? Tôi có thể liệt kê tất cả các tệp trong thư mục đó bằng cách thực hiện

git ls-tree master:dirname

Sau đó tôi có thể sao chép tất cả các tệp riêng lẻ bằng cách thực hiện

git checkout master -- dirname/filename

Tuy nhiên, sử dụng ký tự đại diện cho đến nay là một thất bại hoàn toàn. Điều này không có gì:

git checkout master -- dirname/*.png

Mặc dù tôi đoán rằng tôi có thể sử dụng một tập lệnh bash để làm điều đó, nhưng phải có một cách dễ dàng hơn, phải không?

Câu trả lời:


288

Vì bạn không cố di chuyển các tệp trong cây, nên bạn chỉ có thể kiểm tra thư mục:

git checkout master -- dirname

2
Nếu tôi muốn giữ lại các thông điệp cam kết cho các tệp được sao chép thì sao?
totels

2
@totels, nói đúng ra không có thông điệp cam kết liên quan đến các tập tin; thông điệp cam kết được liên kết với chính đối tượng cam kết. Đây là những gì tôi đoán bạn muốn: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;nơi $COMMIT_SHA1có thể giống như branch_avà sẽ là đối tượng cam kết có thông điệp cam kết bạn muốn. Tôi không biết cách xác định một cách lập trình cam kết với thay đổi gần đây nhấtdirname
Alexander Bird

1
Điều này có một tác dụng phụ rất kỳ lạ. Nó sao chép dirnamekết thúc, nhưng nó cũng sao chép bất kỳ tập tin có trong .gitignorecác masterchi nhánh. Bất cứ ý tưởng tại sao đó là?
Milimetric

4
Một tác dụng phụ khác tôi nghĩ rằng nếu nhánh hiện tại có các tệp bổ sung không nằm trong nhánh mà bạn đang kiểm tra (trong một thư mục đích đã cho), về cơ bản nó sẽ hợp nhất chúng lại với nhau - có lẽ đây chỉ là một tổ tiên? Tôi không chắc chắn về các điều kiện nhưng nếu bạn có 20 tệp trong nhánh A và 20 tệp ở nhánh B và chỉ có 10 tệp có cùng tên tệp, bạn sẽ có 30 tệp (ít nhất là trong trường hợp của tôi là nhánh A là tổ tiên của nhánh B)
codercake 20/03/2016

@totels kiểm tra lệnh git cherry-pick. Nó áp dụng các cam kết từ các nhánh khác, nhưng chỉ các tệp đã được thay đổi trong (các) cam kết bạn muốn.
cs01

18

Nếu không có khoảng trắng trong đường dẫn và bạn quan tâm, như tôi đã từng, trong các tệp chỉ có phần mở rộng cụ thể, bạn có thể sử dụng

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')

4
Thật đáng tiếc khi git không hỗ trợ trực tiếp chức năng này. Chính xác như OP, tôi đã nghĩ nó sẽ giống như thếgit checkout master -- *.c
Gregory Kuhn

1
Câu trả lời này đã giúp tôi trả lời "Làm cách nào tôi có thể kiểm tra các tệp của một mẫu nhất định từ một chi nhánh khác đến chi nhánh làm việc hiện tại của tôi?"
usr-local-
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.