git tỉa từ xa - không hiển thị nhiều cành được cắt tỉa như tôi mong đợi


113

Từ trang người đàn ông:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Vì vậy, tôi đã loại bỏ một loạt các nhánh bằng cách sử dụng

git push origin :staleStuff

và sau đó chạy

git remote prune origin

Tuy nhiên, chỉ có một nhánh địa phương duy nhất được cắt tỉa. Một số chi nhánh do tôi tạo ra, một số do đồng nghiệp. Điều này có cho thấy rằng ngay từ đầu tôi đã không theo dõi chính xác các chi nhánh đó không?


7
để tìm ra những chi nhánh sẽ được gỡ bỏ, bạn có thể làm git remote show originvà cái nhìn đối với bất kỳ chi nhánh đánh dấustale
Có người Một nơi nào đó

Câu trả lời:


189

Khi bạn sử dụng git push origin :staleStuff, nó sẽ tự động loại bỏ origin/staleStuff, vì vậy khi bạn chạy git remote prune origin, bạn đã cắt tỉa một số nhánh bị người khác cắt bỏ. Có nhiều khả năng đồng nghiệp của bạn bây giờ cần phải chạy git pruneđể loại bỏ các nhánh bạn đã loại bỏ.


Vì vậy, những gì chính xác git remote prunelàm gì? Ý tưởng chính: các nhánh cục bộ (không phải các nhánh theo dõi) không được chạm vào bằng git remote prunelệnh và nên được gỡ bỏ theo cách thủ công.

Bây giờ, một ví dụ trong thế giới thực để hiểu rõ hơn:

Bạn có một kho lưu trữ từ xa với 2 nhánh: masterfeature . Giả sử rằng bạn đang làm việc trên cả hai nhánh, do đó, bạn có các tham chiếu này trong kho lưu trữ cục bộ của mình (tên tham chiếu đầy đủ được cung cấp để tránh bất kỳ sự nhầm lẫn nào):

  • refs/heads/master (tên ngắn master)
  • refs/heads/feature (tên ngắn feature)
  • refs/remotes/origin/master (tên ngắn origin/master)
  • refs/remotes/origin/feature(tên viết tắt origin/feature)

Bây giờ, một kịch bản điển hình:

  1. Một số nhà phát triển khác hoàn thành tất cả công việc trên feature, hợp nhất nó vào mastervà xóafeature nhánh khỏi kho lưu trữ từ xa.
  2. Theo mặc định, khi bạn làm git fetch(hoặcgit pull ), không có tham chiếu nào bị xóa khỏi kho lưu trữ cục bộ của bạn, vì vậy bạn vẫn có tất cả 4 tham chiếu đó.
  3. Bạn quyết định dọn dẹp chúng và chạy git remote prune origin .
  4. git phát hiện rằng featurechi nhánh không còn tồn tại, vì vậy refs/remotes/origin/featurelà một chi nhánh cần được loại bỏ.
  5. Bây giờ bạn có 3 tham chiếu, bao gồm refs/heads/feature, vì git remote prunekhông loại bỏ bất kỳ refs/heads/*tham chiếu nào .

Có thể xác định các nhánh cục bộ, liên kết với các nhánh theo dõi từ xa, bằng branch.<branch_name>.mergetham số cấu hình. Tham số này không thực sự cần thiết cho bất kỳ thứ gì hoạt động (có thể là ngoại trừ git pull), vì vậy nó có thể bị thiếu.

(được cập nhật với ví dụ và thông tin hữu ích từ các bình luận)


Tôi hiểu tình huống là: các chi nhánh vẫn hiện diện tại địa phương nhưng đã bị xóa khỏi repo từ xa. Bây giờ tôi muốn xóa tất cả các nhánh cục bộ không tồn tại trên điều khiển từ xa, do đó tôi chạy git trimne. Đó là những gì "Những nhánh cũ này đã bị xóa khỏi kho lưu trữ từ xa" nói với tôi. Liệu tôi có sai?
Felixyz

3
Bạn đúng, nhưng bạn có thể đã hiểu sai ý nghĩa của "chi nhánh địa phương" trong trường hợp git prune. Chỉ những cành ở trong /refs/remotes/<remote_name>/phải cắt tỉa; bất kỳ chi nhánh nào trong đó /refs/heads/sẽ không được chạm vào - bạn phải quản lý chúng theo cách thủ công.
tối đa

Aha, đó thực sự là những gì tôi nghĩ. Vì vậy, không có cách nào để làm những gì tôi muốn: tự động xóa tất cả các nhánh trong đầu đang theo dõi các nhánh từ xa, bằng cách kiểm tra xem các nhánh ở xa đó có bị xóa không?
Felixyz

2
Không có lệnh tích hợp cho điều đó, nhưng bạn có thể tự viết tập lệnh như vậy. Các nhánh theo dõi có thể được xác định bằng sự hiện diện của branch.<branch_name>.mergetham số cấu hình.
tối đa

Câu trả lời này sẽ tốt hơn nếu bạn thêm thông tin trong phần nhận xét vào chính câu trả lời để những ai đến đây và có quan niệm sai lầm như @Felixyz không phải nhìn câu trả lời của bạn một cách buồn cười và sau đó đọc các nhận xét để cuối cùng hiểu được .
Akrikos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.