2010-10-28 12 views
107

Từ trang người đàn ông:git mận từ xa - không hiển thị như nhiều ngành tỉa như tôi mong đợi

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 lấy ra một loạt các chi nhánh sử dụng

git push origin :staleStuff 

và sau đó chạy

git remote prune origin 

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

+6

để tìm ra những chi nhánh sẽ được gỡ bỏ, bạn có thể làm 'git chương origin' từ xa và tìm kiếm bất kỳ chi nhánh đánh dấu 'stale' –

Trả lời

180

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


Vì vậy, chính xác git remote prune làm gì? Ý tưởng chính: các nhánh địa phương (không theo dõi các nhánh) không được chạm bởi lệnh git remote prune và cần được loại bỏ thủ công.

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

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

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

Bây giờ, trường hợp điển hình:

  1. Một số nhà phát triển khác kết thúc tất cả các công việc trên feature, sáp nhập nó vào master và loại bỏ feature chi nhánh từ kho lưu trữ từ xa.
  2. Theo mặc định, khi bạn thực hiện git fetch (hoặc git 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 tài liệu tham khảo đó.
  3. Bạn quyết định xóa chúng và chạy git remote prune origin.
  4. git phát hiện rằng chi nhánh feature không còn tồn tại, vì vậy refs/remotes/origin/feature là chi nhánh cần được loại bỏ.
  5. Bây giờ bạn có 3 tài liệu tham khảo, bao gồm refs/heads/feature, vì git remote prune không xóa bất kỳ tham chiếu refs/heads/* nào.

Có thể xác định các nhánh địa phương, được liên kết với các nhánh theo dõi từ xa, theo thông số cấu hình branch.<branch_name>.merge. Tham số này không thực sự cần thiết cho bất cứ điều gì để làm việc (có thể ngoại trừ git pull), do đó, nó có thể bị thiếu.

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

+0

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

+3

Bạn nói đúng, nhưng bạn có thể đã hiểu sai ý nghĩa của "nhánh địa phương" trong trường hợp 'git prune'. Chỉ các nhánh trong '/ refs/remotes/ /' mới có thể cắt tỉa; bất kỳ nhánh nào trong '/ refs/heads /' sẽ không bị xúc động - bạn phải tự quản lý chúng. – max

+0

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 chi nhánh trong đầu đang theo dõi các chi nhánh từ xa, bằng cách kiểm tra xem những nhánh xa đó có bị xóa hay không? – Felixyz