2012-06-21 23 views
22

Đôi khi tôi làm việc với các kho mã nguồn chứa nhiều nhánh, hầu hết trong số đó là cũ và thường không còn liên quan nữa.Làm cách nào để chỉ liệt kê các nhánh đang hoạt động/đã được thay đổi gần đây trong git?

Trong những trường hợp này, danh sách đầy đủ các chi nhánh từ git branch không phải là rất hữu ích. Có cách nào để chỉ liệt kê các nhánh "hoạt động" không? Ví dụ: chỉ các chi nhánh đã nhận được cam kết trong n ngày qua? Lý tưởng nhất, danh sách sẽ bao gồm ngày cam kết cuối cùng cho từng chi nhánh và cho biết chi nhánh đã được sáp nhập hoàn toàn chưa.

P.S .: Tôi nhận thấy rằng điều này cũng có thể được giải quyết bằng cách xóa các nhánh "cũ" (như được thảo luận, ví dụ: What to do with experimental non-merged git branches?), nhưng điều này có thể không thực tế hoặc được chấp nhận trong một dự án nhất định.

+0

Bản sao có thể có của [Làm cách nào tôi có thể nhận danh sách các chi nhánh git, được sắp xếp theo cam kết gần đây nhất?] (Http://stackoverflow.com/questions/5188320/how-can-i-get-a-list-of -git-branches-ordered-by-most-recent-cam) – sleske

+0

Chỉ cần nhận ra đây là một bản sao. – sleske

Trả lời

27

Bạn có thể sử dụng git-for-each-ref để có được một danh sách của tất cả các chi nhánh địa phương và theo dõi được sắp xếp theo thứ tự giảm dần theo ngày committer của cam kết cuối cùng như thế này:

git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes 

này kết quả đầu ra Eg .:

2012-06-23 refs/heads/master 
2012-06-21 refs/remotes/origin/HEAD 
2012-06-21 refs/remotes/origin/master 

Bạn có thể thêm --count=m để nhận tối đa m chi nhánh, bạn có thể --sort=-authordate thay vì sử dụng ngày bắt đầu, tất nhiên bạn có thể sử dụng các định dạng khác nhau. for-each-ref chính nó không giới hạn kết quả theo ngày, điều này phải được viết riêng, nhưng ít nhất bạn có ngày tháng từ đối tượng cam kết trong tay.

+1

Cool, * exact * những gì tôi đang tìm kiếm. Thật mỉa mai rằng đây thực sự là một phần của git. Có lẽ tôi nên đọc tài liệu ... – sleske

+0

Vâng, tôi cũng vậy:/ – jkrcma

+4

Đừng quên chạy 'git remote prune origin' trước, nếu không bạn có thể nhận được một danh sách cũ bao gồm những thứ không còn tồn tại trên trang web từ xa nữa –

7
ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done; 

Oneliner này in tất cả các nhánh địa phương được sắp xếp theo thời gian từ mới nhất đến cũ nhất. Mỗi nhánh có cam kết cuối cùng với chuỗi ngày tháng có thể đọc được của con người. Bạn có thể thêm nó vào .gitconfig của bạn.

Đối với chi nhánh từ xa tôi đã đưa ra giải pháp đáng sợ này:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $(echo $b | cut -d' ' -f1) --; done | sort -rn -k1,10 | cut -c11- 

Edit: tôi càng nghĩ, càng có nhiều tôi sợ điều này có thể không đáng tin cậy, bởi vì ls-remote luôn kết nối sang một bên từ xa trong khi log không phải. Nó có thể yêu cầu phải làm fetch trước mỗi lần chạy lệnh này.

+0

Mẹo hay. Thật không may, điều này chỉ hoạt động cho các nhánh địa phương, không phải cho các nhánh ở xa (dưới '/ refs/remote'). Nó cũng không hoạt động cho các nhánh theo dõi cục bộ, bởi vì mtime của tệp ref thường phản ánh lần tìm nạp cuối cùng, không phải là cam kết cuối cùng (ngược dòng). – sleske

+0

@sleske Tôi có thể làm phép thuật vỏ, xem câu trả lời cập nhật :) – jkrcma