Làm thế nào để bạn loại bỏ một tham chiếu chi nhánh từ xa không hợp lệ từ Git?


731

Trong repo hiện tại của tôi, tôi có đầu ra sau đây:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Tôi muốn xóa remotes/public/masterkhỏi danh sách chi nhánh:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Ngoài ra, đầu ra của git remotelà lạ, vì nó không liệt kê public:

$ git remote show 
origin

Làm cách nào tôi có thể xóa 'điều khiển từ xa / công khai / chủ' khỏi danh sách chi nhánh?

Cập nhật, đã thử git pushlệnh:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
Đã git remote prune [remote-name]hoặc git fetch -p [remote-name]không làm việc trong kịch bản của bạn? Làm điều đó với git gcrất nhiều mạnh mẽ hơn bình thường cần thiết.
rjmunro

6
git remote prune [remote-name]sẽ không hoạt động với git svn, mặc dù git gc... git branch -rd origin/namekhông hoạt động. @Casey, có lẽ bạn nên chọn câu trả lời thứ hai - nó hơi ít nguy hiểm.
vô hiệu hóa

4
Tôi thích câu hỏi này. Trở lại gần như mỗi tháng
oluckyman

Liên quan, nếu không phải là mục tiêu dupe: Xóa một nhánh Git cả cục bộ và từ xa .

2
Để tránh lỗi gitter n00b trong tương lai, tôi khuyên bạn nên sử dụng một nhánh ví dụ khác với master... đặc biệt là khi xóa trên điều khiển từ xa.
vắng mặt

Câu trả lời:


743

Bạn có thể cần dọn dẹp:

git gc --prune=now

hoặc bạn có thể cần cắt tỉa:

git remote prune public

tỉa

Xóa tất cả các nhánh theo dõi cũ dưới <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 "điều khiển từ xa / <name>".

Với tùy chọn --dry-run, hãy báo cáo những nhá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, có vẻ như những thứ này đã được dọn sạch trước đó với

git remote rm public 

rm

Xóa điều khiển từ xa có tên <name>. Tất cả các nhánh theo dõi từ xa và cài đặt cấu hình cho điều khiển từ xa được loại bỏ.

Vì vậy, có thể bạn đã chỉnh sửa tệp cấu hình của mình và điều này không xảy ra hoặc bạn có vấn đề về đặc quyền.

Có thể chạy lại và xem những gì sẽ xảy ra.


Tư vấn bối cảnh

Nếu bạn xem nhật ký sửa đổi , bạn sẽ lưu ý rằng tôi đã đề xuất các kỹ thuật "chính xác" hơn, vì lý do nào đó không muốn làm việc trên kho lưu trữ của họ.

Tôi nghi ngờ OP đã làm một cái gì đó khiến cây của họ ở trạng thái không nhất quán khiến nó có hành vi hơi kỳ lạ, và git gcđược yêu cầu sửa chữa bên trái phía sau hành trình.

Thông thường git branch -rd origin/badbranch là đủ để thu thập một nhánh theo dõi cục bộ hoặc git push origin :badbranchđể lấy một nhánh từ xa và thông thường bạn sẽ không bao giờ cần phải gọigit gc


4
Tôi không muốn xóa chi nhánh ở phía xa. Tôi nghĩ rằng có một sự khác biệt tinh tế.
cmcginty

2
er, câu hỏi là hỏi một cách hiệu quả "làm thế nào để tôi xóa một chi nhánh từ xa". Đó là những gì những con đường.
Kent Fredric

1
Tôi sẽ viết lại chủ đề nếu điều đó làm rõ hơn những gì tôi đang hỏi, nhưng lệnh cho biết chính xác vấn đề của tôi là gì.
cmcginty

40
git gckhông cần thiết ở đây, nhưng git remote prunelàm cho tôi cảm thấy an toàn hơn là xóa mọi thứ bằng tay git branch -rd, vì git đang xác minh những nhánh từ xa nào được thực hiện.
Mike Seplowitz

3
điều này không làm việc cho tôi - tuy nhiên, 'chi nhánh git' hoạt động tốt.
DSummersl

683

Tất cả bạn cần làm là

git fetch -p

Nó sẽ xóa tất cả các chi nhánh địa phương của bạn đã bị xóa từ xa.

Nếu bạn đang sử dụng git 1.8.5+, bạn có thể đặt tự động

git config fetch.prune true

hoặc là

git config --global fetch.prune true

7
Đây là những gì tôi đang tìm kiếm - câu hỏi đang mô tả một kịch bản phức tạp hơn so với kịch bản phổ biến.
rjmunro

22
Tôi đang tìm cách xóa các nhánh cục bộ nơi điều khiển từ xa tương ứng đã bị xóa, nhưng điều này không hiệu quả với tôi. Bất cứ ý tưởng tại sao?
jackocnr

11
Điều này loại bỏ các nhánh được liệt kê trong remote / origin nhưng không xóa các nhánh theo dõi cục bộ, điều này cũng quan trọng như vậy.
BlueRaja - Daniel Pflughoeft

@Cupdding Vì bạn không quay lại bản chỉnh sửa đầu tiên của tôi (đang sửa thông tin không chính xác về Git 1.8.5+), giờ bạn đã thực hiện điều này không chính xác. Chỉnh sửa thứ hai của tôi là sửa những gì tôi đưa vào đó không chính xác, hiện tại nó lại xuất hiện (với sự phục hồi của bạn). Vui lòng tiếp tục và quay lại một lần chỉnh sửa để có bản gốc. Cảm ơn.
ferventcoder

@ferventcoder Tôi đã kiểm tra lại lần chỉnh sửa cuối cùng của bạn và quay lại với nó. OP có thể quay trở lại nếu anh ta không thích nó. Cảm ơn.

319
git push public :master

Điều này sẽ xóa chi nhánh từ xa có tên masterlà Kent Fredric đã chỉ ra.

Để liệt kê các nhánh theo dõi từ xa:

git branch -r

Để xóa một nhánh theo dõi từ xa:

git branch -rd public/master

6
Điều này giúp tôi loại bỏ một nhánh ma từ xa git-svn.
Nick

9
git branch -rd removed_remote/branchlàm việc cho tôi, trong khi git gc --prune=nowlà vô giá trị.
rchampour trước

2
Tôi đã có thể sử dụng git prunemà không gặp vấn đề gì, nhưng đồng nghiệp của tôi, người đã chia rẽ repo chính của chúng tôi ** CHỈ CÓ THỂ ** sử dụng git branch -rd public/mastergiải pháp kiểu để làm sạch môi trường của anh ta.
Abel

3
git branch -rd public/masterlà những gì tôi đã thiếu. Tôi đã có heroku/masterherkou/master... lol woops
Aaron

@rchampourlier Không phải vô giá trị 100% - nếu git repo của bạn lớn, việc loại bỏ các nhánh không sử dụng có thể giải phóng rất nhiều dung lượng đĩa trong một số trường hợp.
peterh - Tái lập Monica

159

Tất cả bạn cần làm là

$ git branch -rd origin/whatever 

Nó đơn giản mà. Không có lý do để gọi một gc ở đây.


1
Làm thế nào để bạn "đẩy" xóa mà đến github?
Thufir

14
@Thufir Đó không phải là câu hỏi này. Câu hỏi này được chỉ định cụ thể cho các tình huống khi bạn có một tham chiếu từ xa không hợp lệ trong repo cục bộ, nhưng nhánh đó không còn tồn tại trên máy chủ từ xa. Câu trả lời cho câu hỏi của bạn là $ git push origin:
anything

Có, nếu có điều gì đó xảy ra trên repo từ xa nơi một nhánh bị xóa, nhưng bạn vẫn có tham chiếu đến nhánh từ xa đó trên máy cục bộ của mình, thì bạn sẽ cần phải làm những gì tôi đưa vào câu trả lời ban đầu của mình để dọn sạch nó.
jpswain

6
Nếu bạn có một công việc dọn dẹp lớn (rất nhiều điều khiển từ xa), bạn có thể xóa tất cả các nhánh từ xa bằng một cái gì đó như git branch -rd $(git branch -r)sau đó thiết lập lại những cái hợp lệ bằng cách tìm nạp.
tộc

Tình hình của tôi là tôi đã từng git config -eđổi tên điều khiển từ xa của mình. Tôi đổi tên từ xa minethành origin. Sau đó, đây là giải pháp phù hợp nhất với tôi:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu

70

git gc --prune=now không phải là những gì bạn muốn.

git remote prune public

hoặc git remote prune origin# nếu đó là nguồn từ xa

là những gì bạn muốn


6
@Casey $ git gc # không thích phân mảnh cho các tệp git để tăng tốc độ lưu trữ $ git remote prune origin # sẽ xóa sạch các nhánh từ xa cũ xuất hiện với "git Branch -r | grep origin". Đó là những gì câu hỏi đang hỏi tôi tin. Vì vậy, các lệnh là hoàn toàn khác nhau.
tongueroo

29

Câu trả lời được chấp nhận đã không làm việc cho tôi khi ref được đóng gói. Điều này không tuy nhiên:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

Đã làm cho tôi. Nhánh git thông thường -d không hoạt động, trả về lỗi mà nhánh đó không tồn tại, vì tôi đã xóa nguồn gốc được gọi là "bản gốc", được tạo ra do nhầm lẫn, trực tiếp trong tệp .git / config.
micrub

Đây là phương pháp tôi phải sử dụng để loại bỏ các nhánh vô tình bị bỏ sót khỏi .git / config của tôi (phải được xây dựng lại do tham nhũng không liên quan). Thật tệ khi câu trả lời này đã đi quá xa đến nỗi tôi không nhận ra nó cho đến khi cuối cùng tôi tìm ra giải pháp và đã đi thêm nó vào câu trả lời được chấp nhận!
taranaki

Đây là những gì tôi cần sau khi sử dụng svn2git. Có rất nhiều chi nhánh từ xa / svn / *. Trước tiên phải tạo một 'svn' không có thật.
Sam

7

Trong trường hợp của tôi, tôi đã cố gắng xóa các mục đã được lưu trong .git/packed-refs. Bạn có thể chỉnh sửa tệp văn bản đơn giản này và xóa các mục từ tệp git br -Dkhông biết cách chạm (Ít nhất là trong phiên bản 1.7.9.5).

Tôi tìm thấy giải pháp này tại đây: https://stackoverflow.com/a/11050880/1695680


wow, điều này đã giúp tôi. Đồng nghiệp của tôi đã thử, khởi động lại VS, Khởi động lại máy tính của anh ta không có gì hiệu quả, anh ta đã xóa repo cục bộ của mình và kéo mọi thứ để thoát khỏi điều này :)
Esen

1
Hôm nay tôi tin rằng tệp refs đóng gói này được tạo như một phần của git gcnó, khi nó đóng gói các cam kết của bạn vào một kho lưu trữ được nén cao, nó cũng chuyển các tham chiếu thành một tệp văn bản đơn giản, có thể cho mục đích tối ưu hóa; Tôi hy vọng các phiên bản tương lai của git có thể git br -D ...đóng gói refs.
ThorSummoner


3

Tôi không biết về git branch -rdbản thân mình, vì vậy cách tôi tự giải quyết các vấn đề như thế này là coi repo của tôi như một repo từ xa và xóa từ xa. git push . :refs/remotes/public/master. Nếu các cách khác không hoạt động và bạn có một số tài liệu tham khảo kỳ lạ mà bạn muốn loại bỏ, thì cách thô này là chắc chắn. Nó cung cấp cho bạn độ chính xác chính xác để loại bỏ (hoặc tạo!) Bất kỳ loại tham chiếu nào.


2

Chỉ liên quan một chút, nhưng vẫn có thể hữu ích trong tình huống tương tự như chúng tôi đã có - chúng tôi sử dụng chia sẻ tệp mạng cho kho lưu trữ từ xa của chúng tôi. Tuần trước mọi thứ đã hoạt động, tuần này chúng tôi đã gặp lỗi "Nguồn gốc từ xa không quảng cáo Ref cho refs / Heads / master. Ref này có thể không tồn tại trong điều khiển từ xa hoặc có thể bị ẩn bởi cài đặt quyền"

Nhưng chúng tôi tin rằng không có gì đã được thực hiện cho những thứ tham nhũng. NFS thực hiện các ảnh chụp nhanh nên tôi đã xem xét từng "phiên bản trước" và thấy rằng ba ngày trước, kích thước tính bằng MB của kho lưu trữ đã tăng từ 282MB lên 33 MB và hiện có khoảng 1.403 tệp mới và 300 thư mục. Tôi đã hỏi các đồng nghiệp của mình và một người đã cố gắng thực hiện một cú hích vào ngày hôm đó - sau đó hủy bỏ nó.

Tôi đã sử dụng chức năng "Khôi phục" NFS để khôi phục nó ngay trước ngày đó và bây giờ mọi thứ hoạt động tốt trở lại. Tôi đã thử cắt tỉa trước đây, dường như không giúp đỡ. Có lẽ việc dọn dẹp khắc nghiệt hơn sẽ có hiệu quả.

Hy vọng điều này có thể giúp đỡ người khác một ngày nào đó!

Jay


2

Tôi đã có một vấn đề tương tự. Không có câu trả lời nào giúp được. Trong trường hợp của tôi, tôi đã xóa hai kho lưu trữ từ xa hiển thị vĩnh viễn.

Ý tưởng cuối cùng của tôi là loại bỏ tất cả các tham chiếu đến nó bằng tay.

Giả sử kho lưu trữ có tên là Repo Hồi. Tôi đã làm:

find .git -name Repo 

Vì vậy, tôi đã xóa các tệp và thư mục tương ứng khỏi thư mục .git ( thư mục này có thể được tìm thấy trong ứng dụng Rails hoặc trên máy tính của bạn https://stackoverflow.com/a/19538763/6638513 ).

Sau đó, tôi đã làm:

grep Repo -r .git

Điều này tìm thấy một số tệp văn bản trong đó tôi loại bỏ các dòng tương ứng. Bây giờ, mọi thứ dường như đều ổn.

Thông thường, bạn nên rời bỏ công việc này để git.

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.