Xóa các nhánh từ xa cũ khỏi Git


80

Khi tôi sử dụng tính năng tự động hoàn thành bash trong Git, nó sẽ tiếp tục hiển thị cho tôi các nhánh điều khiển từ xa cũ mà tôi không còn nữa. Khi tôi làm điều git branch -lađó, nó sẽ hiển thị những điều khiển từ xa cũ và các nhánh trong khi một điều git branch -lthì không. A ls .git/refs/remotes/cũng cho họ thấy. Tuy nhiên, chúng không có trong .git / config của tôi và chúng cũng không hiển thị khi tôi chạy git remote show.

Vậy làm cách nào để loại bỏ chúng vì danh sách tự động điền của tôi hiện tại quá dài.

Tôi đã thử:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

Tôi cũng biết thực tế là tôi có thể sao chép lại repo nhưng đó chỉ là gian lận ;-)


Lưu ý: git remote rmbây giờ (git 2.0.1, tháng 6 năm 2014) xóa đầu tiên các nhánh theo dõi từ xa. Điều đó sẽ giúp bạn tránh làm sạch các cành già. Xem câu trả lời của tôi bên dưới
VonC


Đây là một câu trả lời khác của tôi: stackoverflow.com/a/44129766/3835843
Arif

Câu trả lời:


142

Git không tự động xóa các nhánh theo dõi từ xa (cục bộ) nếu nhánh đã bị xóa trong kho lưu trữ từ xa. Ngoài ra, trước V2.0.1, các nhánh theo dõi từ xa trong một số trường hợp không bị xóa khi bạn xóa điều khiển từ xa khỏi cấu hình git của mình (xem câu trả lời của VonC).

Để xóa các nhánh theo dõi từ xa cũ (các nhánh đã bị xóa trong kho lưu trữ từ xa) cho một trong các kho lưu trữ từ xa của bạn, hãy chạy

git remote prune <remote>

Để trích dẫn trang người đàn ông hoặc git remote:

tỉa cành

Xóa tất cả các nhánh theo dõi cũ trong <name>. Các nhánh cũ này đã bị xóa khỏi kho lưu trữ từ xa được tham chiếu bởi <name>, nhưng vẫn có sẵn cục bộ trong "remotes / <name>".

Với tùy chọn --dry-run, báo cáo những cành nào sẽ được cắt tỉa, nhưng không thực sự cắt tỉa chúng.

Tuy nhiên, từ câu hỏi của bạn, có vẻ như bạn đã xóa theo cách thủ công .git/refs/remotes/theoldremote, vì vậy Git không còn biết về kho lưu trữ từ xa mà các chi nhánh theo dõi từ xa thuộc về. Đó không phải là cách bạn phải làm.

Cách thông thường để xóa kho lưu trữ từ xa là chạy

git remote rm <remote>

Thao tác này sẽ xóa điều khiển từ xa khỏi của bạn .git/configvà sẽ xóa các nhánh theo dõi từ xa.

Nếu bạn chỉ xóa thư mục bên dưới .git/refs/remotes/, các nhánh sẽ vẫn ở phía sau. Sau đó, bạn sẽ cần phải xóa chúng theo cách thủ công:

git branch -rd <remote>/<branchname>

Bạn cần tùy chọn -rđể xóa một chi nhánh từ xa.


2
Không, không phải vậy. Nó nói fatal: 'kolichikov' does not appear to be a git repository.
Alex

2
Đối với cắt tỉa tự động của chi nhánh từ xa trên lấy / pull, xem thêm: stackoverflow.com/a/18718936/968201
Patrick James McDougle

Nếu bạn thấy điều này chậm, hãy nâng cấp lên Git mới hơn (2.0.1+ IIRC) để khắc phục lỗi này (nhanh hơn 100 lần).
odinho - Velmont

Lưu ý cho người dùng lược bớt: Tài liệu Git cho biết " Trong hầu hết các trường hợp, người dùng nên chạy git gc, gọi là git trimne. ". Tuy nhiên lưu ý rằng git gckhông tương thích với --dry-run.
JYL

git branch -rd <remote>/<branchname>là những gì tôi đang tìm kiếm. Cảm ơn bạn!
Antoine Colson

16

tôi sử dụng

git push origin :remote_branch

để xóa một nhánh khỏi máy chủ.

git remote prune origin

để xóa các tham chiếu từ xa không còn tồn tại trên máy chủ nữa


Không, không phải vậy. Nó nóifatal: 'kolichikov' does not appear to be a git repository
Alex

1
Alex, bạn phải chạy lệnh bên trong thư mục kho lưu trữ không có trong thư mục chính của bạn ...
SparK 14/02/19

6

Lưu ý: trong khi câu trả lời là git remote trimne, hãy biết rằng, bắt đầu với git 2.0.1 (ngày 25 tháng 6 năm 2014), một git remote rm bắt đầu bằng cách loại bỏ các nhánh theo dõi từ xa .
Vì vậy, hy vọng rằng người ta sẽ không phải dọn dẹp các cành già sau khi git remote rm.

Xem cam kết b07bdd3 của Jens Lindström ( jensl)

remote rm: xóa cấu hình từ xa như cuối cùng

Khi xóa điều khiển từ xa, hãy xóa các nhánh theo dõi từ xa trước khi xóa cấu hình từ xa.
Bằng cách này, nếu hoạt động không thành công hoặc bị hủy bỏ trong khi xóa các nhánh theo dõi từ xa, lệnh có thể được chạy lại để hoàn tất hoạt động .


Nhưng nếu bạn phải làm vậy, đơn giản git fetchlà đủ, với điều kiện bạn đã đặt trước:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true


4

Không đẩy vào một nhánh để xóa nó:

git push remote :remote_branch

Nó ở đâu đó trong tài liệu nhưng nó không thực sự rõ ràng.

Hay tôi đã hiểu sai câu hỏi của bạn?


2
"Nó ở đâu đó trong tài liệu nhưng nó không thực sự rõ ràng." như vậy làgit
mnagel

Bởi "từ xa", tôi có nghĩa là tên kho lưu trữ từ xa của bạn. Chẳng hạn như "nguồn gốc" hoặc bất cứ điều gì. Nhưng tôi bắt đầu nghĩ rằng bạn có ý gì khác ngoài việc xóa nhánh từ xa.
aragaer

Một cái gì đó khác chẳng hạn như thế này: stackoverflow.com/questions/1072171/…
aragaer

4

Ok, tôi hiểu rồi. Vấn đề là các điều khiển từ xa không tồn tại nữa, nhưng chúng tồn tại ở đâu đó trong cơ sở dữ liệu git. Tôi đã thêm lại điều khiển từ xa, sau đó đã

git remote prune theremote
git remote rm theremote
git gc --prune=now

Sau đó, họ biến mất khỏi danh sách. Bằng cách nào đó tôi đã không loại bỏ chúng một cách chính xác trước khi tôi đoán.


Tôi đã thử mọi thứ từ nhiều nguồn và điều duy nhất hiệu quả là thêm lại điều khiển từ xa và sau đó xóa nó. Cảm ơn!
jc00ke

0

Tôi đã bối rối khi các nhánh từ xa đã bị xóa ở phía máy chủ vẫn xuất hiện khi tôi chạy:

$ git branch --all

Lệnh sau đã sửa lỗi này cho tôi (trên git phiên bản 2.25.0):

$ git remote update --prune
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.