git xóa điều khiển từ xa: không tồn tại giới thiệu từ xa


107

Nói ngắn gọn;

  • Làm cách nào để xóa nhiều điều khiển từ xa đã hợp nhất từ ​​xa?

Thêm nền tảng;

Tôi có một repo git với hàng chục điều khiển từ xa đã được hợp nhất thành chính. Tôi có thể xóa từng điều khiển từ xa này bằng cách sử dụng:

git push --delete origin myBranch-1234

Tuy nhiên, đây là một quá trình chậm và tẻ nhạt cho tất cả các điều khiển từ xa. Vì vậy, tôi đang thử lệnh này:

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

git branch -r --mergedliệt kê tất cả các điều khiển từ xa đã hợp nhất.
grep originyêu cầu lệnh bao gồm điểm gốc.
grep -v mastercho lệnh loại trừ cái chính.
xargs git push origin --deletera lệnh xóa danh sách điều khiển từ xa.

Tất cả cùng nhau, tôi hy vọng điều này sẽ thu thập tất cả các điều khiển từ xa đã hợp nhất và xóa chúng.

Khi tôi chạy lệnh trên, tôi nhận được thông tin sau cho mọi điều khiển từ xa đã hợp nhất;

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

Tuy nhiên, những điều khiển từ xa này vẫn tồn tại và tôi có thể kiểm tra từng điều khiển trong số đó. Nhiều trang web và mọi người khuyên tôi nên chạy git fetch --pruneđể làm sạch các tài liệu tham khảo bị thiếu. Điều này không có gì vì tất cả các điều khiển từ xa này đều tồn tại.

Vì vậy, tôi hỏi bạn, trao đổi ngăn xếp thân yêu;

  • Tại sao tôi có thể xóa một điều khiển từ xa mà không xóa nhiều điều khiển?
  • Lệnh của tôi có đúng không?

Tôi nghĩ rằng tôi đang thiếu một cái gì đó nhỏ. Mỗi khi tôi nghiên cứu điều này, có vẻ như tôi đang làm điều này một cách chính xác, nhưng tôi đang gặp các lỗi ở trên.

Câu trả lời:


226

Trước tiên, bạn có thể cần phải cắt bớt "bộ nhớ cache" cục bộ của các nhánh từ xa. Thử chạy:

git fetch -p origin

trước khi xóa.


2
Điều đó đã giải quyết nó cho tôi, cảm ơn! Tuy nhiên, tại sao nó không cập nhật khi tôi tìm nạp mà không có --prune? Theo tôi đó là khá gây hiểu lầm
dave0688

6
Chỉ là một lưu ý cho những người đến đây từ một cuộc tìm kiếm - trong khi điều này rõ ràng hữu ích cho phần lớn những người đến đây, nó không thực sự chính xác về vấn đề ban đầu - vấn đề của OP là lệnh của anh ta được đưa origin/vào tên chi nhánh không chính xác , như đã mô tả / được giải quyết trong các câu trả lời khác.
CupawnTae

104

Các nhánh đó có bị loại bỏ từ xa (gốc) không? Nếu có, bạn chỉ cần làm

git fetch --prune origin

Nếu không, chúng có thể trở lại ngay cả sau khi bạn xóa chúng cục bộ.

Cập nhật: Xem lại lệnh của bạn, có vẻ như bạn đang xây dựng nó không chính xác. Bạn có thể muốn

git push origin --delete myBranch-1234

nhưng thay vào đó bạn đang làm một cái gì đó như

git push origin --delete origin/myBranch-1234

Không có nhánh nào bị loại bỏ tại nguồn gốc. Tôi có thể kiểm tra bất kỳ ai trong số họ.
Jqw

1
có, bởi vì bạn thực hiện các lệnh khác nhau trong trường hợp thứ hai.
Mykola Gurov

1
Tôi không hiểu quan điểm của bạn. Tôi biết rằng tôi đang sử dụng hai lệnh khác nhau. Trường hợp thứ hai là nhận tất cả các điều khiển từ xa đã hợp nhất với git branch -r --mergedvà sau đó tôi đang cố gắng xóa chúng bằng xargs git push origin --delete. Lệnh đang cố gắng xóa các điều khiển từ xa ngoại trừ lệnh cho rằng remote ref does not exist.
Jqw

1
trong lệnh thứ hai của bạn, đặt tiếng vọng ngay bên cạnh xargsđể xem những gì thực sự được thực thi.
Mykola Gurov

2
@Jqw Bạn không thể thêm origin/tiền tố vào tên nhánh, git đã biết bạn đang làm việc với các nhánh của origin vì bạn đang chạy git push origin. Đề nghị của Mykola là thực hiện phần cuối cùng của lệnh xargs echo, thay vì echo xargs [...].
Matthew Đọc

15

Sử dụng sedđể loại bỏ phần 'origin /' và thay đổi xargsphần lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
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.