Xóa tất cả các thẻ khỏi kho lưu trữ Git


224

Tôi muốn xóa tất cả các thẻ từ kho lưu trữ Git. Làm thế nào tôi có thể làm điều đó?

Sử dụng git tag -d tagnamexóa thẻ tagnamecục bộ và sử dụng git push --tagsTôi cập nhật các thẻ trên nhà cung cấp git.

Tôi đã thử:

git tag -d *

Nhưng tôi thấy điều đó *có nghĩa là các tập tin từ thư mục hiện tại.

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

Hãy xem xét tôi có rất nhiều thẻ, và tôi muốn xóa chúng, tất cả.

Câu trả lời:


419
git tag | xargs git tag -d

Đơn giản chỉ cần sử dụng triết lý Linux nơi bạn đặt mọi thứ. Trên Windows sử dụng git bash với cùng một lệnh.


136
Cảm ơn. Lệnh này xóa các thẻ cục bộ. Tôi đã sử dụng git tag -l | xargs -n 1 git push --delete originđể xóa chúng từ xa.
Ionică Bizău

7
Và trên Windows?
CodeManX

7
@CoDEmanX Trên Windows, bạn nên sử dụng git bash với cùng một lệnh.
inf3rno

2
Không xóa các thẻ từ xa, cũng rất chậm đối với hàng ngàn thẻ.
Adrian Baker

1
'xargs' không được công nhận là lệnh nội bộ hoặc bên ngoài trên windows 10
Gulzar

207

Để xóa các thẻ từ xa (trước khi xóa các thẻ cục bộ) chỉ cần làm:

git tag -l | xargs -n 1 git push --delete origin

và sau đó xóa các bản sao cục bộ:

git tag | xargs git tag -d

Xóa từ xa là cách quá chậm đối với hàng tá thẻ.
ffxsam

5
Câu trả lời này nhanh hơn nhiều nếu bạn có rất nhiều thẻ từ xa: stackoverflow.com/a
432395864/747044

Thứ tự các lệnh trong câu trả lời này giả định rằng không có thẻ chỉ cục bộ.
Acumenus

Điều này là quá chậm, dưới đây giải pháp là tốt hơn.
Root Fool

Nếu bạn cần nhập cụm mật khẩu cho các xác nhận, điều này yêu cầu cụm mật khẩu cho mỗi thẻ. Các giải pháp khác là tốt hơn.
kap

56

Có thể hiệu quả hơn khi đẩy xóa tất cả các thẻ trong một lệnh. Đặc biệt nếu bạn có vài trăm.

Trong trình bao không phải cửa sổ phù hợp, xóa tất cả các thẻ từ xa:

git tag | xargs -L 1 | xargs git push origin --delete

Sau đó xóa tất cả các thẻ địa phương:

git tag | xargs -L 1 | xargs git tag --delete

Điều này sẽ ổn nếu bạn không có 'tên thẻ. Vì vậy, các lệnh sau sẽ ổn.

git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git push origin --delete
git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git tag --delete

Các cách khác để lấy danh sách các dòng, gói chúng trong dấu ngoặc kép, biến chúng thành một dòng duy nhất và sau đó chuyển dòng đó đến một lệnh có thể tồn tại. Xem xét đây là môi trường da mèo cuối cùng và tất cả.


3
Tôi đã có vài nghìn thẻ, xóa từng cái một từ một repo trên đám mây từ xa đã mất nhiều ngày, điều này đã giải quyết được.
Adrian Baker

Làm gì xargs -L 1?
ymett

-L max-lines --max-lines [= max-lines] -l [max-lines] Sử dụng ở hầu hết các dòng đầu vào không trống tối đa trên mỗi dòng lệnh. Đối với '-l', các dòng tối đa mặc định là 1 nếu bị bỏ qua. Đối với '-L', đối số là bắt buộc. Khoảng trống lưu trữ làm cho một dòng đầu vào được tiếp tục một cách hợp lý trên dòng đầu vào tiếp theo, với mục đích đếm các dòng. Ngụ ý '-x'. Biểu mẫu '-l' của tùy chọn này không được hỗ trợ cho tùy chọn '-L' tuân thủ POSIX. gnu.org/software/findutils/manual/html_node/find_html/
Richard A Quadling

@RichardAQuadling Ok, nhưng điều đó có ảnh hưởng gì trong câu trả lời? git tagtrả về các thẻ, mỗi thẻ trên một dòng và sau đó xargs -L 1xuất ra một thẻ trên mỗi dòng, vậy nó dùng để làm gì?
ymett

Hừm. Dường như không có gì trong bối cảnh này! Khác hơn là làm cho mọi thứ một liên lạc chậm hơn!
Richard A Quadling

24

Đối với người dùng Windows sử dụng PowerShell:

git tag | foreach-object -process { git tag -d $_ }

Điều này xóa tất cả các thẻ được trả về bằng git tagcách thực hiện git tag -dcho mỗi dòng được trả về.


23

Thêm vào câu trả lời của Stefan đã thiếu cách xóa thẻ từ xa. Đối với windows powershell, bạn có thể chạy nó để xóa các thẻ từ xa trước tiên là các thẻ cục bộ.

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  

19

Nếu bạn không có các thẻ trong repo cục bộ của mình, bạn có thể xóa các thẻ từ xa mà không cần phải đưa nó đến repo cục bộ của bạn.

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

Đừng quên thay thế "nguồn gốc" thành tên trình xử lý từ xa của bạn.


Thông minh! Điều này đã xóa tất cả trong một lần. Lệnh khác đã xóa cứ sau 2 giây
fregante 27/03/18


6

Bạn cũng có thể dùng:

git tag -d $(git tag)

điều này sẽ không hoạt động nếu bạn có nhiều thẻ, như hàng ngàn
DixonD

trong trường hợp này, bạn có thể sử dụng một cái gì đó như: thẻ git -d $ (thẻ git | head -n 999) và thực hiện nó x lần
ViZeke

1

Vì tất cả các tùy chọn này chỉ hoạt động trong linux, đây là các cửa sổ tương đương với bất kỳ ai phải đối phó với điều đó:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t

1

Tôi phải xóa các thẻ có tiền tố

ví dụ: tôi phải xóa các thẻ v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

git tag -d $(git tag -l "v0.0.*")

Để liệt kê tất cả các thẻ có tiền tố

git tag -l "v0.0.*"

Để xóa các thẻ

git tag -d $tag_names

Đó là cách tuyên bố đầu tiên hoạt động


Nhanh chóng, đơn giản và hiệu quả. Đã làm việc, cảm ơn!
Vedran Mandić

0

Powershell v7 hỗ trợ foreach song song nếu bạn có nhiều thẻ ngược dòng (gốc) mà bạn cần xóa:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
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.