2013-03-19 26 views
23

Tôi không muốn lấy tất cả các chi nhánh từ nguồn gốc vì có rất nhiều chi nhánh. Tôi chỉ muốn theo dõi một vài (ví dụ: master) và các chi nhánh của tôi (được tổ chức theo my_name thư mục con). Tôi có thể làm như sau:Tôi có thể chỉ định trong .git/config để tìm nạp nhiều refspec không?

$ git fetch origin refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch 

Tôi muốn chỉ định "tập hợp" các refspec là mặc định là git fetch. Tôi đã cố gắng

$ git config remote.origin.fetch refs/heads/my_name/*:refs/remotes/origin/my_name/* 
$ git config --add remote.origin.fetch refs/heads/master:refs/remotes/origin/master 

Nó thất bại:

$ git config remote.origin.fetch 
refs/heads/my_name/*:refs/remotes/origin/my_name/* 
error: More than one value for the key remote.origin.fetch: refs/heads/master:refs/remotes/origin/master 

Tôi cũng thử như sau nhưng nó cũng thất bại:

$ git config remote.origin.fetch 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch' 
$ git fetch 
fatal: Invalid refspec 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch' 

Lưu ý: Git 1.7.11

+1

Lưu ý: kể từ Git 2.1 (tháng 8 năm 2014), bạn có thể ghi đè truy vấn tìm nạp trên cơ sở mỗi lệnh (nghĩa là chỉ cho một lệnh), với tùy chọn tìm nạp mới '--refmap = ': xem [câu trả lời của tôi bên dưới] (http://stackoverflow.com/a/25098004/6309) – VonC

Trả lời

26

Bạn có thể thêm các dòng sau trong số .git/config để chỉ định nhiều lần truy tìm cho tìm nạp:

[remote "origin"] 
     fetch = refs/heads/my_name/*:refs/remotes/origin/my_name/* 
     fetch = refs/heads/master:refs/remotes/origin/master 
     fetch = refs/heads/some_branch:refs/remotes/origin/some_branch 

Bạn có thể thêm tiền tố + trước refspec, nếu bạn muốn ghi đè lên lấy tài liệu tham khảo không nhanh về phía trước là tốt, như thế này:

[remote "origin"] 
     fetch = +refs/heads/my_name/*:refs/remotes/origin/my_name/* 
     fetch = +refs/heads/master:refs/remotes/origin/master 
     fetch = +refs/heads/some_branch:refs/remotes/origin/some_branch 

Lưu ý rằng globbing phần không được hỗ trợ (I E a/b/ca* không được hỗ trợ, nhưng a/b/* là).

10.5 Git Internals - The Refspec

+1

Tôi nhận ra rằng lỗi được báo cáo bởi "git config remote.origin.fetch" không có nghĩa là nó không thể hoạt động với nhiều giá trị. Tôi chỉ cần phải truy vấn nó một cách khác nhau bằng cách sử dụng "git config --get-all remote.origin.fetch" – user716468

+2

@Tuxdude Cảm ơn vì điều đó. Có một lệnh duy nhất có thể đạt được ở trên không? Tôi đang cố gắng giữ tài liệu của mình ngắn gọn cho các nhà phát triển mới, tôi muốn họ có thể chỉ định nhiều refspecs thông qua "git config remote.origin.fetch" thay vì chỉnh sửa tệp cấu hình git của họ. – danjah

+0

@Danjah giống như "+ refs/heads/master: refs/remotes/origin/master" "sẽ hoạt động – jmnas

4

Lưu ý: nếu bạn muốn lấy từ một refspec khác nhau trên gọi đơn (trọng tạm thời các Truy xuất refspec đăng ký trong config), bạn có thể làm như vậy kể từ Git 2.1 (tháng Tám năm 2014).

Xem commit c5558f8 bởi Junio C Hamano (gitster):

Kể từ sự ra đời của bản cập nhật cơ hội của chi nhánh từ xa theo dõi, bắt đầu vào khoảng f269048 (fetch: cách cơ hội cập nhật refs theo dõi, 2013/05/11) với một vài cập nhật trong Phiên bản v1.8.4, cấu hình remote.*.fetch luôn khởi động ngay cả khi một refspec chỉ định những gì cần tìm nạp được đưa ra trên dòng lệnh và không có cách nào để vô hiệu hóa hoặc ghi đè nó theo yêu cầu.

Dạy lệnh chú ý đến các tùy chọn dòng lệnh --refmap=<lhs>:<rhs> có thể được sử dụng để ghi đè việc sử dụng cấu hình remote.*.fetch làm sơ đồ.

Cung cấp cho bạn các tùy chọn mới:

--refmap=<refspec> 

Khi lấy refs liệt kê trên dòng lệnh, sử dụng refspec quy định (có thể được nhiều hơn một lần) để lập bản đồ refs để remote- theo dõi các chi nhánh, thay vì các giá trị của remote.*.fetch biến cấu hình cho kho lưu trữ từ xa.
Xem phần trên "Chi nhánh theo dõi từ xa được định cấu hình" để biết chi tiết.

(Đó Git "Configured chi nhánh từ xa theo dõi" mục cũng ngày từ Git 2.1: xem "Having a hard time understanding git fetch")

4

Để ghi đè lên hiện lấy refspec (s), mà không cần phải tự chỉnh sửa .git/config, bạn có thể sử dụng --unset-all theo sau là nhiều --add nếu cần.

Đối với ví dụ refspecs mong muốn trong câu hỏi, nó sẽ là:

$ git config --unset-all remote.origin.fetch 
    $ git config --add remote.origin.fetch +refs/heads/my_name/*:refs/remotes/origin/my_name/* 
    $ git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master 

Sau đó sử dụng git config --get-all remote.origin.fetch để xác minh kết quả.

+0

Chính xác những gì tôi cần! Về cơ bản, khi thẻ phiên bản được cập nhật, điều này sẽ ngăn không cho thẻ cũ nằm trong cách thức và cập nhật (và lưu trữ) mà không có bất kỳ hình phạt nào đối với thẻ mới. Bạn thậm chí có thể quay lại thẻ cũ mà không gặp vấn đề gì. – taranaki

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