2011-11-22 31 views
26

Tại nơi làm việc, chúng tôi đang sử dụng các nhánh chủ đề được tích hợp vào một vài (3) nhánh chính tại một số điểm. Bây giờ tôi muốn xóa tất cả các nhánh chủ đề khỏi kho từ xa của chúng tôi đã được tích hợp hoàn toàn vào một nhánh chính. Nếu điều đó là không thể, việc lấy danh sách các nhánh địa phương đã được tích hợp cũng sẽ ổn.Làm thế nào để xóa tất cả các nhánh git từ xa đã được tích hợp?

Trả lời

35

Edit:

câu trả lời tốt nhất từ ​​bình luận skalee của:

git branch -a --merged remotes/origin/master | grep -v master | grep "remotes/origin/" | cut -d "/" -f 3- | xargs -n 1 git push --delete origin 

Cũ câu trả lời:

git push --delete remote topicbranch 

hoặc

git push remote :topicbranch 

Đưa ra một danh sách các chi nhánh, sẽ là một cái gì đó với git branch --merged master

+1

Cảm ơn, 'git branch --merged' trông rất đẹp. Thật không may nó sẽ không hoạt động đúng với các nhánh đã được rebased trong quá trình tích hợp .. nhưng tốt, ít nhất * một số * của shitload (160) của các nhánh được liệt kê là siêu an toàn để xóa. – ThiefMaster

+0

Các nhánh bị xóa thì phức tạp hơn ... Điều đó có thể xảy ra, nhưng nó đòi hỏi ít nhất là shellscript sẽ kéo danh sách các bản sửa đổi sau điểm nhánh và sau đó tìm kiếm các chữ ký vá dọc theo nhánh master ... không nhận thức được bất kỳ giải pháp đã nấu chín nào cho việc này. –

+0

Điều này là tuyệt vời, mặc dù tôi đã đánh vào snag nhỏ. Tôi đặt tên các nhánh của mình bằng một '/', ví dụ: một tên chi nhánh của tôi có thể là 'sf/correct-typo-7'. Do tham số '-f 3' trên ** cut **, tên nhánh này sẽ bị cắt bớt thành' sf'. Thay đổi tham số thành '-f 3-', sửa vấn đề này và xử lý các nhánh với bất kỳ số lượng dấu gạch chéo nào. –

14

Bạn có thể làm điều này trong một đi với

git branch --merged master | grep -v master | xargs -n 1 git push --delete origin 

Dump rằng trong một kịch bản gọi là 'sạch' nếu bạn tìm thấy bạn đang làm điều này thường xuyên.

+12

Nếu bạn muốn xóa tất cả các nhánh từ xa, không chỉ những nhánh có đối tác địa phương của chúng: 'git branch -a --merged remotes/origin/master | grep -v master | grep "điều khiển từ xa/nguồn gốc /" | cắt -d "/" -f 3 | xargs -n 1 git push --xóa gốc'. Ngoài ra, tôi khuyên bạn nên sử dụng 'remote/origin/master' thay cho' master' đơn giản để loại trừ thứ bạn đã hợp nhất cục bộ nhưng chưa được đẩy, trong trường hợp nếu cuối cùng bạn quên hoặc quyết định không push. – skalee

+2

@skalee cảm ơn! điều này làm việc cho tôi ngoại trừ khi các nhánh nằm trong các thư mục - sử dụng 'cut -d"/"-f 3-' để thay thế. Tôi cũng phải thêm 'grep -v develop' để dừng nó cố gắng loại bỏ nhánh dev của tôi. – antonyh

+0

'xargs -n 1' quá chậm, nếu bạn có nhiều nhánh sử dụng' xargs -n 20' để thay thế. – mozillazg

9

Nếu bạn muốn xóa các chi nhánh từ xa từ kho lưu trữ nguồn gốc:

git branch -r --merged develop | egrep -iv '(master|develop)' | sed 's/origin\///g' | xargs -n 1 git push --delete origin 
+0

Điều này cũng hữu ích khi xóa tất cả các nhánh ngược dòng sau một ngã rẽ – ianstarz

+0

đây là câu trả lời đúng thực :), vì những người khác dường như không thể xóa các nhánh bao gồm dấu gạch chéo, mà chúng tôi sử dụng (mặc dù) tính năng/tính năng của tôi, bugfix/my-feature –

+0

Điều này có vẻ khá tốt, ngoại trừ việc sử dụng nguồn gốc/chủ hoặc nguồn gốc/phát triển là một tiêu chuẩn khá quan trọng để có thể loại bỏ nội dung nào đó. Bạn không thể xóa nội dung nào đó từ xa chỉ vì bạn đã hợp nhất nó vào phiên bản địa phương của nhánh chính, có khả năng bạn quên đẩy nhánh đó vào điều khiển từ xa, điều này có nghĩa là xóa các nhánh chưa được tạo ra. –

1

Đây là những lệnh Tôi đang sử dụng để loại bỏ tất cả mọi thứ trộn vào origin/master. Về cơ bản, tôi loại bỏ tất cả các chi nhánh sáp nhập vào master từ GitHub.

git remote update -p && 
git branch -r --merged origin/master | 
grep origin | 
grep -v master | 
cut -d"/" -f2- | 
xargs git push origin --delete 
0

Chỉ dành cho người dùng Powershell và cửa sổ.

git branch -r --merged | findstr /v "origin/master" | %{git push origin --delete $_.Trim().Substring(7)} 
Các vấn đề liên quan