Tôi thường không trả lời một câu hỏi đã có 16 câu trả lời, nhưng tất cả các câu trả lời khác đều sai và câu trả lời đúng rất đơn giản. Câu hỏi cho biết: "Có cách nào đơn giản để xóa tất cả các nhánh theo dõi mà tương đương từ xa không còn tồn tại không?"
Nếu "đơn giản" có nghĩa là xóa tất cả chúng trong một lần, không mong manh, không nguy hiểm và không phụ thuộc vào các công cụ mà không phải tất cả độc giả sẽ có, thì câu trả lời đúng là: không.
Một số câu trả lời rất đơn giản, nhưng họ không làm những gì được hỏi. Những người khác làm những gì được yêu cầu, nhưng không đơn giản: tất cả đều dựa vào phân tích đầu ra Git thông qua các lệnh thao tác văn bản hoặc ngôn ngữ kịch bản, có thể không có trên mọi hệ thống. Trên hết, hầu hết các đề xuất đều sử dụng các lệnh bằng sứ, mà đầu ra của nó không được thiết kế để được phân tích cú pháp bởi tập lệnh ("sứ" dùng để chỉ các lệnh dành cho hoạt động của con người; các tập lệnh nên sử dụng các lệnh "ống nước" cấp thấp hơn).
Đọc thêm:
Nếu bạn muốn thực hiện việc này một cách an toàn, đối với trường hợp sử dụng trong câu hỏi (các nhánh theo dõi thu gom rác đã bị xóa trên máy chủ nhưng vẫn tồn tại dưới dạng các nhánh cục bộ) và chỉ với các lệnh Git cấp cao, bạn phải
git fetch --prune
(hoặc git fetch -p
, đó là một bí danh, hoặc git prune remote origin
thực hiện điều tương tự mà không cần tìm nạp, và có lẽ không phải là điều bạn muốn hầu hết thời gian).
- Lưu ý bất kỳ chi nhánh từ xa được báo cáo là đã xóa. Hoặc, để tìm thấy chúng sau này,
git branch -v
(bất kỳ nhánh theo dõi mồ côi nào sẽ được đánh dấu "[biến mất]").
git branch -d [branch_name]
trên mỗi nhánh theo dõi mồ côi
(đó là những gì một số câu trả lời khác đề xuất).
Nếu bạn muốn viết kịch bản một giải pháp, thì đó for-each-ref
là điểm khởi đầu của bạn, như trong câu trả lời của Mark Longair ở đây và câu trả lời này cho một câu hỏi khác , nhưng tôi không thể thấy cách khai thác mà không cần viết vòng lặp shell shell, hoặc sử dụng xargs hoặc một cái gì đó .
Giải thích lý lịch
Để hiểu những gì đang xảy ra, bạn cần đánh giá cao rằng, trong tình huống theo dõi các chi nhánh, bạn không chỉ có một chi nhánh, mà là ba. (Và nhớ lại rằng "nhánh" có nghĩa đơn giản là một con trỏ tới một cam kết.)
Đưa ra một nhánh theo dõi feature/X
, kho lưu trữ từ xa (máy chủ) sẽ có nhánh này và gọi nó feature/X
. Kho lưu trữ cục bộ của bạn có một nhánh remotes/origin/feature/X
có nghĩa là "Đây là những gì mà điều khiển từ xa nói với tôi về tính năng / nhánh X của nó, lần trước chúng ta đã nói chuyện" và cuối cùng, kho lưu trữ cục bộ có một nhánh feature/X
trỏ đến cam kết mới nhất của bạn và được định cấu hình để "Theo dõi" remotes/origin/feature/X
, có nghĩa là bạn có thể kéo và đẩy để giữ cho chúng thẳng hàng.
Tại một số điểm, ai đó đã xóa feature/X
trên điều khiển từ xa. Từ lúc đó, bạn bị bỏ lại với địa phương của mình feature/X
(điều mà bạn có thể không muốn nữa, vì công việc trên tính năng X có lẽ đã kết thúc) và remotes/origin/feature/X
điều đó chắc chắn là vô dụng vì mục đích duy nhất của nó là ghi nhớ trạng thái của chi nhánh máy chủ .
Và Git sẽ cho phép bạn tự động dọn sạch phần dư thừa remotes/origin/feature/X
- đó là những gì git fetch --prune
- nhưng vì một số lý do, nó không cho phép bạn tự động xóa feature/X
... mặc dù bạn feature/X
vẫn chứa thông tin theo dõi mồ côi, vì vậy nó có thông tin để xác định các nhánh theo dõi cũ đã được sáp nhập hoàn toàn. (Rốt cuộc, nó có thể cung cấp cho bạn thông tin cho phép bạn tự thực hiện thao tác.)
* master
trên hệ thống của tôi. Lệnh sau có tác dụng với tôi:git branch -d $(git branch --merged |tail -n +2)