2012-04-09 12 views
21

Làm cách nào để có thể nhận tất cả tên của một số nhánh gốc từ xa?Danh sách Git của tên chi nhánh của từ xa cụ thể

Tôi bắt đầu từ các tùy chọn --remote --list nhưng nhận được thông báo origin/HEAD -> origin/master thư và chi nhánh từ một nguồn gốc khác.

$> git branch --remote --list 
    origin/HEAD -> origin/master 
    origin1/develop 
    origin1/feature/1 
    origin1/feature/2 
    origin1/feature/3 
    origin1/master 
    origin2/develop 
    origin2/feature/1 
    origin2/feature/2 
    origin2/master 

Chi nhánh của nguồn gốc cụ thể có thể được đối sánh với tùy chọn <pattern> nhưng thông báo dư thừa vẫn còn đó. Trên thực tế mô hình đó không thực sự chính xác, bởi vì một số tên gốc có thể là một chuỗi con của một tên gốc khác hoặc thậm chí một số nhánh.

$> git branch --remote --list origin1* 
    origin1/HEAD -> origin/master 
    origin1/develop 
    origin1/feature/1 
    origin1/feature/2 
    origin1/feature/3 
    origin1/master 

Tôi đang tìm kiếm cái gì là danh sách các tên chi nhánh của origin1, ai trong số họ tôi có thể sử dụng cho git checkout lệnh. Một cái gì đó như thế:

develop 
feature/1 
feature/2 
feature/3 
master 

Điều quan trọng là nó phải được thực hiện mà không grep, sed, tail hoặc thậm chí ghc -e giấy gói, chỉ với đúng git điện, vì biến mất an toàn và họ là.

Trả lời

30

Điều quan trọng là nó phải được thực hiện mà không grep, sed, tail hoặc thậm chí ghc -e giấy gói, chỉ với sức mạnh git sự thật, vì sự thay đổi mất an toàn và họ là.

Đó là chỉ đúng đối với lệnh git sứ (xem "What does the term porcelain mean in Git?")

Sử dụng lệnh ls-remote, và sau đó bạn sẽ có thể để lọc đầu ra của nó hệ thống ống nước.

ls-xa mà không cần tham số vẫn sẽ liệt kê các HEAD từ xa:

[email protected]:~/ce/ce6/.git$ git ls-remote origin 
8598d26b4a4bbe416f46087815734d49ba428523 HEAD 
8598d26b4a4bbe416f46087815734d49ba428523 refs/heads/master 
38325f657380ddef07fa32063c44d7d6c601c012 refs/heads/test_trap 

Nhưng nếu bạn chỉ yêu cầu Thủ trưởng nói từ xa:

[email protected]:~/ce/ce6/.git$ git ls-remote --heads origin 
8598d26b4a4bbe416f46087815734d49ba428523 refs/heads/master 
38325f657380ddef07fa32063c44d7d6c601c012 refs/heads/test_trap 

câu trả lời cuối cùng:

[email protected]x:~/ce/ce6/.git$ git ls-remote --heads origin | sed 's?.*refs/heads/??' 
master 
test_trap 

(Có, nó sử dụng sed, nhưng đầu ra của lệnh hệ thống ống nước được cho là ổn định ugh được phân tích cú pháp)

+0

Có vẻ tuyệt vời. Cảm ơn câu trả lời đầy đủ. –

+3

Tôi cũng có thể trả lời câu hỏi này, nhưng điều gì sẽ xảy ra với quy tắc "no sed"? lol, bất cứ điều gì – KurzedMetal

+3

@KurzedMetal đúng, nhưng tôi cẩn thận biện minh cho việc sử dụng 'sed' bằng cách chỉ sử dụng lệnh hệ thống ống nước, thay vì lệnh sứ như 'git branch'. Xem ví dụ http://stackoverflow.com/questions/2978947/how-to-list-all-the-log-for-current-project-in-git/2979124#2979124 hoặc http://stackoverflow.com/questions/2976665/git-changelog-day-by-day/2976776 # 2976776 – VonC

2

Câu trả lời hiện tại đều sử dụng điều gì đó không rõ ràng trong câu hỏi (sed) và là lệnh từ xa.

Tôi thấy điều này mà tránh được cả những vấn đề này, chỉ sử dụng lệnh git địa phương và một ống:

git rev-parse --remotes=origin | git name-rev --name-only --stdin 

Cập nhật: Không thực sự tối ưu trong hai, nhưng giữ nó nếu ai đó biết làm thế nào để cải thiện nó. Nó liệt kê từ xa đầy đủ bao gồm tiền tố /điều khiển từ xa/nguồn gốc nếu bạn không có chi nhánh địa phương, nhưng chỉ có tên địa phương nếu bạn có. Ngoài ra nó dường như bỏ qua một số refs nếu có một số trỏ đến cùng một SHA1.

3

Một phương pháp thay thế, sau khi một số nghiên cứu về cùng một vấn đề, đó là:

git for-each-ref --format='%(refname:strip=2)' refs/remotes/<remote_name> 

này sẽ cung cấp một danh sách sắp xếp của refs địa phương để biết các tên từ xa tại điểm lần cuối bạn lấy.

Bạn có thể điều chỉnh điều này cho thẻ của họ, v.v.