2010-06-14 52 views
13

Tôi có một kho lưu trữ cục bộ được sao chép từ kho lưu trữ từ xa trống. Lệnh sau liệt kê các nhánh của kho lưu trữ từ xa.Trong git, làm cách nào để kiểm tra các nhánh từ xa của kho từ xa?

$ git ls-remote <remote> 

74bd3eb190edb39db04f6c0c4dbbb9e1e96bc6db refs/remotes/test 
85de54d6ae813c624b9623983e6b0a4948dae0fe refs/remotes/trunk 

Tôi muốn thanh toán và theo dõi nhánh từ xa của xa từ xa trunk. Làm thế nào để làm điều đó?

Lưu ý rằng điều này khác với việc kiểm tra chi nhánh cục bộ của kho từ xa. Đây là cách kho lưu trữ từ xa trông như thế nào.

$ git branch -a 

master 
remotes/test 
remotes/trunk 

Sau khi chạy git fetch < từ xa> để lấy tất cả các chi nhánh kho từ xa, tôi nhận được kết quả này trong kho địa phương.

$ git branch -r 

repo/HEAD -> repo/master 
repo/master 
+1

Câu trả lời của Jefromi và Chris là đủ. Tôi chỉ cần thêm để tham khảo câu hỏi thú vị SO http://stackoverflow.com/questions/1070496/having-a-hard-time-understanding-git-fetch. – VonC

Trả lời

11

Bạn có thể tìm nạp bất kỳ từ nào từ bất kỳ điều khiển từ xa nào (miễn là máy chủ sẵn sàng cung cấp cho bạn). Chìa khóa để tìm nạp thông tin bên ngoài refs/heads/ là cung cấp đầy đủ đường dẫn ref bắt đầu bằng refs/. Nếu muốn, bạn thậm chí có thể kéo từ các kho lưu trữ không được định cấu hình làm điều khiển từ xa (git fetch có thể lấy URL thay vì tên từ xa).

Theo mặc định, các điều khiển từ xa được định cấu hình sẽ chỉ tìm nạp từ không gian tên refs/heads/ của kho từ xa, vì vậy chúng sẽ không nhận bất kỳ thứ gì bên trong refs/remotes/. Tuy nhiên, bạn có thể tham khảo một ref bên trong nó bằng cách sử dụng một ref hoàn chỉnh như refs/remotes/trunk (remotes/trunk cũng có thể làm việc, nhưng cũng có thể không rõ ràng).

Nếu refspec được tìm nạp không chỉ định ref đích, nó sẽ được lưu trữ trong ref đặc biệt FETCH_HEAD.


Fetch của refs/remote/trunk vào FETCH_HEAD và kiểm tra xem nó ra như một TRỤ tách kho:

git fetch remote-name-or-url refs/remotes/trunk && 
git checkout FETCH_HEAD 

Same, nhưng tạo ra một tên, chi nhánh địa phương thay vì sử dụng một TRỤ tách ra:

git fetch remote-name-or-url refs/remotes/trunk && 
git checkout -b trunk-from-remote FETCH_HEAD 

Tương tự, nhưng trực tiếp vào chi nhánh địa phương:

git fetch remote-name-or-url refs/remotes/trunk:trunk-from-remote && 
git checkout trunk-from-remote 

Nếu bạn đang làm việc với điều khiển từ xa được cấu hình, bạn có thể viết lại cấu hình remote.<remote-name>.fetch và thêm mục nhập bổ sung để tự động tìm nạp từ cả hai số refs/heads/refs/remotes/.

# fetch branchs of remote into remote-name/heads/* 
git config remote.remote-name.fetch '+refs/heads/*:refs/remotes/remote-name/heads/*' && 
# fetch remotes of remote into remote-name/remotes/* 
git config --add remote.remote-name.fetch '+refs/remotes/*:refs/remotes/remote-name/remotes/*' 

Để tránh va chạm có thể, ví dụ trên cấu hình lấy để lưu trữ refs vào không gian tên rời nhau (…/heads/…/remotes/). Bạn có thể chọn các tên khác nhau nếu bạn muốn. Nếu bạn chắc chắn sẽ không có xung đột, bạn thậm chí có thể nhồi cả hai trực tiếp dưới refs/remotes/remote-name/.

+0

Tôi có thể thiết lập điều này để nó tự động kéo nhánh từ xa vào một chi nhánh địa phương theo dõi không? Hay tôi tốt hơn để đảm bảo điều khiển từ xa có các nhánh theo dõi cục bộ của riêng mình, sau đó tôi theo dõi cục bộ? –

+0

@Hans: Tôi đã viết lại câu trả lời. Tôi nhấn mạnh khía cạnh “từ xa chưa được định cấu hình” có lẽ không quan trọng đối với bạn và đã thêm một chút vào cuối khi tự động tìm nạp. –

+0

Làm cách nào để thiết lập chi nhánh địa phương để theo dõi một trong những nhánh từ xa từ xa? Tôi thực hiện một 'git checkout -b trunk chính xác - track repo/remotes/trunk', nhưng sau đó một 'git pull repo' sẽ không hiểu cấu hình branch.trunk.merge của tôi. Tôi phải làm một 'git pull repo refs/điều khiển từ xa/trunk: refs/điều khiển từ xa/repo/điều khiển từ xa/thân cây' cho nó để làm việc. –

-1

git.exe checkout --track -b trunk refs/remotes/trunk

+0

Vấn đề ở đây là nhánh từ xa không có nhánh địa phương theo dõi các nhánh từ xa của nó. –

+0

Đó là nghĩa vụ phải đánh vần "kho lưu trữ từ xa không có" ... –

6

Câu hỏi hay! Tôi biết rằng điều này hoạt động; không thể nghĩ ra bất cứ điều gì khác mà không ra khỏi đỉnh đầu của tôi:

git fetch origin refs/remotes/trunk 
git checkout FETCH_HEAD 
# or make a branch to check out 
git checkout -b remote-trunk FETCH_HEAD 

Đó là kỳ quặc, bằng cách này, rằng những refs từ xa là không có dạng refs/remotes/<remote-name>/<branch-name> ... có lẽ tôi hiểu lầm tên, nhưng phương pháp này hoạt động.

3

Thực ra, tôi đã tìm thấy giải pháp thỏa mãn cho điều này. Thêm bộ điều khiển từ xa thiết lập một bộ lọc để tìm nạp và kéo đầu cục bộ của nó. Tôi thiết lập một điều khiển từ xa khác mà tôi gọi/repo-remotes/lấy các thông tin từ xa từ xa. Tệp .git/config kết thúc giống như thế này

[remote "repo"] 
    url = ssh://[email protected]<hostname>:<port>/repo 
    fetch = +refs/heads/*:refs/remotes/repo/* 

[remote "repo-remotes"] 
    url = ssh://[email protected]<hostname>:<port>/repo 
    fetch = +refs/remotes/*:refs/remotes/repo-remotes/* 

Sau đó tôi có thể thực hiện việc này.

$ git fetch repo-remotes 
$ git checkout -b remote-trunk --track remotes/repo-remotes/trunk 

Thiết lập chi nhánh địa phương theo dõi nhánh/thân cây từ xa của kho từ xa.

+0

Không cần điều khiển từ xa thứ hai, chỉ cần thêm cấu hình tìm nạp bổ sung. –

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