Làm thế nào để xóa một thẻ từ xa?


3421

Làm thế nào để bạn xóa một thẻ Git đã được đẩy?

Câu trả lời:


5754

Bạn chỉ cần đẩy một tham chiếu 'trống' đến tên thẻ từ xa:

git push origin :tagname

Hoặc, rõ ràng hơn, sử dụng --deletetùy chọn (hoặc -dnếu phiên bản git của bạn cũ hơn 1.8.0):

git push --delete origin tagname

Lưu ý rằng git có không gian tên thẻ và không gian tên nhánh để bạn có thể sử dụng cùng tên cho một nhánh và cho thẻ. Nếu bạn muốn đảm bảo rằng bạn không thể vô tình xóa chi nhánh thay vì thẻ, bạn có thể chỉ định tham chiếu đầy đủ sẽ không bao giờ xóa chi nhánh:

git push origin :refs/tags/tagname

Nếu bạn cũng cần xóa thẻ cục bộ, hãy sử dụng:

git tag --delete tagname

Lý lịch

Đẩy một nhánh, thẻ hoặc tham chiếu khác vào kho lưu trữ từ xa liên quan đến việc chỉ định "repo nào, nguồn nào, đích nào?"

git push remote-repo source-ref:destination-ref

Một ví dụ trong thế giới thực nơi bạn đẩy nhánh chính của mình đến nhánh chính của nguồn gốc là:

git push origin refs/heads/master:refs/heads/master

Mà do các đường dẫn mặc định, có thể được rút ngắn thành:

git push origin master:master

Thẻ hoạt động theo cùng một cách:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

Mà cũng có thể được rút ngắn thành:

git push origin release-1.0:release-1.0

Bằng cách bỏ qua nguồn ref (phần trước dấu hai chấm), bạn đẩy 'nothing' đến đích, xóa ref trên đầu từ xa.


187
+1 cho cả hai trả lời câu hỏi và giải thích trường hợp chung và nêu chi tiết ý nghĩa của cú pháp không rút gọn
Peter Host

77
Và chỉ trong trường hợp ai đó tự hỏi làm thế nào để xóa nhiều thẻ tại một thời điểm bạn đơn giản liệt kê chúng bằng cách sử dụng khoảng trắng, ví dụ git push --delete origin tag1 tag2. Tương tự là hợp lệ cho việc xóa thẻ cục bộgit tag -d tag1 tag2
dVaffection

8
Nếu tên thẻ va chạm với tên chi nhánh, bạn có thể sẽ xóa chi nhánh của mình. Ha-ha. Xem câu trả lời thứ hai - đó là sinh thái hơn
zuba

1
@EmmaHe A chỉ tagđược đính kèm với một cam kết duy nhất. Do đó, tên chi nhánh không liên quan.
cb2

1
Nó cũng thú vị để biết rằng git tag -d `git tag`sẽ xóa tất cả các thẻ địa phương. Áp dụng tương tự cho git push --delete origin `git tag`giả sử bạn đã kéo các thẻ từ xa cục bộ. Đó là tiện dụng trong một môi trường thử nghiệm.
DarkFranX

383

Một cách đơn giản hơn là

git push --delete origin YOUR_TAG_NAME

Cú pháp dấu hai chấm tiền tố IMO hơi kỳ lạ trong tình huống này


4
Tôi nghĩ rằng đây là cách thích hợp ... cú pháp khác trông giống như hack đối với tôi.
Luigi R. Viggiano

11
Đúng, đây là đơn giản và làm việc. Mặc dù tôi sẽ làm rõ câu trả lời bằng cách chỉ định phần biến là gì: git push --delete origin "TAGNAME"trong đó TAGNAME là tên của thẻ gốc.
Teemu Leisti

12
Những công việc này. Một bổ sung: Nếu bạn có một chi nhánh và một thẻ có cùng tên, bạn có thể đặt từ đó tagtrước tên thẻ của mình để đảm bảo bạn nhận được thẻ chứ không phải chi nhánh.
andypaxo

9
@andypaxo Những gì lệnh thực hiện là refspecs, cách chính xác sẽ là tiền tố các thẻ với refs/tags/, như thế này : refs/tags/v2.3.1.
p3lim

Tôi đã có tên thẻ 'xấu' được tạo trên máy chủ từ xa, có ký tự đặc biệt, vì vậy tôi không thể đồng bộ hóa với tên đó, vì vậy, chỉ cần xóa tên đó với đề xuất của bạn: dịch vụ git push --delete origin "- <default> - 151 ", không thể xóa nó không phải bằng intellij, không phải với stash, không phải với sourceTree. Cảm ơn !
Dmitri Algazin

215

Nếu bạn có một thẻ từ xa v0.1.0để xóa, và điều khiển từ xa của bạn origin, thì chỉ cần:

git push origin :refs/tags/v0.1.0

Nếu bạn cũng cần xóa thẻ cục bộ:

git tag -d v0.1.0

Xem câu trả lời của Adam Franco để biết giải thích về :cú pháp bất thường của Git để xóa.


2
Điều này cũng hoạt động với jgit. thẻ tốc ký không hoạt động với jgit
rynop

Tôi có fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Chaim Eliyah

3
@ChaimEliyah bạn có một dấu gạch chéo hàng đầu, có thể đó là vấn đề của bạn
Joffrey

5
Câu trả lời tốt hơn, vì điều này cũng hoạt động nếu bạn có một chi nhánh và một thẻ được gọi là giống nhau.
Erik A. Brandstadmoen

Chỉ :tagnamenên làm việc cho việc xóa từ xa.
Acumenus

106

Xóa tất cả các thẻ cục bộ và nhận danh sách các thẻ từ xa :

git tag -l | xargs git tag -d
git fetch

Xóa tất cả các thẻ từ xa

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

Làm sạch các thẻ địa phương

git tag -l | xargs git tag -d

2
Làm thế nào để loại bỏ tất cả các thẻ từ repos địa phương và từ xa. Đây là những gì tôi đang tìm kiếm, cảm ơn!
Jorge Orpinel

git lấy, xóa từ xa và sau đó dọn dẹp người dân địa phương, làm việc đẹp!
DiegoRBaquero

chậm, nhưng đơn giản nhất
Lucent Fox

34

Để xóa thẻ khỏi kho lưu trữ từ xa:

git push --delete origin TAGNAME

Bạn cũng có thể muốn xóa thẻ cục bộ:

git tag -d TAGNAME

vì vậy một dòng để làm cả hai:git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken

25

Từ thiết bị đầu cuối của bạn, làm điều này:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

Bây giờ hãy truy cập Github.com và làm mới, chúng biến mất.


3
thẻ git không phải thẻ
DSF

23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. Dòng đầu tiên, xóa your_tag_nametừ repo địa phương .
  2. Dòng thứ hai, xóa your_tag_nametừ repo từ xa .
  3. Nhấn nút Hủy bản thảo trong phần Phát hành GitHub của bạn .

nhập mô tả hình ảnh ở đây


2
Mặc dù lệnh này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó. Cách trả lời
Popo

20

Xóa thẻ cục bộ '12345'

git tag -d 12345

Xóa thẻ từ xa '12345' (ví dụ: phiên bản GitHub)

git push origin :refs/tags/12345

cách tiếp cận khác

git push --delete origin tagName
git tag -d tagName

nhập mô tả hình ảnh ở đây


15

Chỉ cần lưu ý rằng, nếu bạn có một nhánh từ xa được đặt tên là một thẻ từ xa, các lệnh này không rõ ràng:

git push origin :tagname
git push --delete origin tagname

Vì vậy, bạn phải sử dụng lệnh này để xóa thẻ:

git push origin :refs/tags/<tag>

và cái này để xóa chi nhánh:

git push origin :refs/heads/<branch>

Nếu không, bạn sẽ gặp một lỗi như thế này:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'

Ngắn gọn và súc tích. Bài đăng này cùng với MeganZhou xuất hiện là câu trả lời cho lý do tại sao chúng tôi gặp sự cố, tên nhánh và tên thẻ giống hệt nhau. Tôi đã xóa thẻ cục bộ và đẩy sang: refs / tags và tất cả đều tốt.
rwheadon

12

Phương pháp nhanh hơn tới 100 lần cho hàng ngàn thẻ từ xa

Sau khi đọc qua các câu trả lời này trong khi cần xóa hơn 11.000 thẻ, tôi đã học được các phương pháp này dựa hoặc xargsmất quá nhiều thời gian, trừ khi bạn có nhiều giờ để ghi.

Gặp khó khăn, tôi thấy hai nhiều cách nhanh hơn. Đối với cả hai, hãy bắt đầu bằng git taghoặc git ls-remote --tagsđể tạo một danh sách các thẻ bạn muốn xóa trên điều khiển từ xa. Trong các ví dụ dưới đây, bạn có thể bỏ qua hoặc thay thế sorting_proccessing_etcbằng bất kỳ greping, sorting, tailing hoặc heading nào bạn muốn ( ví dụ: grep -P "my_regex" | sort | head -n -200 v.v. ):


Phương pháp đầu tiên này nhanh nhất, có thể nhanh hơn 20 đến 100 lần so với sử dụng xargsvà hoạt động với ít nhất vài nghìn thẻ mỗi lần.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

Cái này hoạt động ra sao? Danh sách các thẻ thông thường, được phân tách bằng dòng được chuyển đổi thành một dòng các thẻ được phân tách bằng dấu cách, mỗi thẻ được thêm vào :như vậy. . .

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

Sử dụng git pushvới thẻ định dạng này sẽ đẩy không có gì vào mỗi ref từ xa, xóa nó (định dạng thông thường để đẩy theo cách này là local_ref_path:remote_ref_path).

Phương pháp hai được chia ra thành một câu trả lời riêng ở nơi khác trên cùng trang này


Sau cả hai phương pháp này, có lẽ bạn cũng sẽ muốn xóa các thẻ cục bộ của mình. Điều này nhanh hơn nhiều vì vậy chúng tôi có thể quay lại sử dụng xargsgit tag -d, là đủ.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

HOẶC tương tự như xóa từ xa:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")

Bạn nên chia điều này thành một vài câu trả lời khác nhau. Câu trả lời với nhiều thẻ trên một dòng là, không nghi ngờ gì, câu trả lời đúng cho việc xóa thẻ hàng loạt. Thật sự hơi khó để tìm thấy thông tin này gần như bất cứ nơi nào khác. Ngay cả khi biết những gì tôi đang tìm kiếm, tôi cũng gặp khó khăn khi tìm thấy nó trong trang trợ giúp git :) Vì vậy, hãy nói với bạn và làm nổi bật đó là câu trả lời đúng và chuyển API GitHub sang một vị trí khác. Và cuối cùng, các thẻ xóa cục bộ, hàng loạt, hoạt động với các thẻ được phân tách bằng dấu cách (loại bỏ dấu hai chấm)
CubanX

Cảm ơn lời khen ngợi và đề xuất. Tôi sẽ chia nó ra. Tôi không hiểu nhận xét của bạn về việc xóa thẻ địa phương. Tôi không nghĩ đoạn mã lệnh cuối cùng của tôi sử dụng bất kỳ dấu hai chấm nào, nhưng tôi đang sử dụng điện thoại di động nên có thể thiếu một cái gì đó.
TonyH

Xin lỗi, tôi chỉ có nghĩa là những gì bạn đang làm để xóa các thẻ từ xa, hoạt động với việc xóa các thẻ cục bộ, cung cấp toàn bộ danh sách cùng một lúc. :) Chỉ thay vì git push origin: tag1: tag2, v.v. bạn sẽ thực hiện git tag --delete tag1 tag2 tag3 theo cách đó bạn có thể có tổng dọn dẹp. Một lần nữa, cảm ơn rất nhiều!
Cuba

11

Nếu bạn sử dụng SourceTree - GUI Git tuyệt vời - thì bạn có thể dễ dàng thực hiện việc này mà không cần dòng lệnh bằng cách thực hiện như sau:

  1. Mở kho lưu trữ của bạn trong SourceTree
  2. Chọn và mở rộng tab "Thẻ" ở bên trái
  3. Nhấp chuột phải vào thẻ bạn muốn xóa
  4. Chọn "Xóa YOUiah_NAME"
  5. Trong cửa sổ xác minh, chọn "Xóa thẻ khỏi điều khiển từ xa"

YOUiah_NAME hiện sẽ bị xóa khỏi kho lưu trữ cục bộ của bạn và tất cả các điều khiển từ xa - có thể là GitHub, BitBucket hoặc bất cứ nơi nào khác mà bạn đã liệt kê dưới dạng từ xa cho kho lưu trữ đó.

Ngoài ra, nếu bạn đã xóa một thẻ cục bộ nhưng không có nguồn gốc từ xa và bạn muốn xóa nó ở mọi nơi, thì chỉ cần tạo một thẻ mới có cùng tên và được đính kèm tại cùng một cam kết với nguồn gốc. Sau đó, lặp lại các bước trên để xóa ở mọi nơi.


Hoạt động như một lá bùa. Cảm ơn!
Native_Mobile_Arch_Dev


7

Nếu bạn đang sử dụng PowerShell và bạn muốn xóa một loạt chúng:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Tất nhiên, bạn cũng có thể lọc chúng trước khi xóa:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }

Đó là ví dụ regex trơn tru và tốt. Xin cảm ơn ngài
Yunus

7

Như @CubanX đã đề xuất, tôi đã tách câu trả lời này khỏi bản gốc của mình:

Đây là một phương pháp nhanh hơn nhiều lần xargsvà có thể mở rộng hơn nhiều với điều chỉnh. Nó sử dụng API Github , mã thông báo truy cập cá nhân và tận dụng tiện ích parallel.

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallelcó nhiều chế độ hoạt động, nhưng thường song song với bất kỳ lệnh nào bạn đưa ra trong khi cho phép bạn đặt giới hạn về số lượng quy trình. Bạn có thể thay đổi --jobs 2tham số để cho phép hoạt động nhanh hơn, nhưng tôi gặp vấn đề với giới hạn tốc độ của Github , hiện là 5000 / giờ, nhưng dường như cũng có giới hạn ngắn hạn không có giấy tờ.


Sau này, có lẽ bạn cũng muốn xóa các thẻ cục bộ của mình. Điều này nhanh hơn nhiều vì vậy chúng tôi có thể quay lại sử dụng xargsgit tag -d, là đủ.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

Điều này có vẻ phức tạp hơn nhiều so với câu trả lời được chấp nhận. Lợi ích là gì?
theStherSide

2
Nếu bạn cần xóa vài nghìn thẻ, thì tốc độ nhanh hơn 10 - 100 lần
TonyH

Cảm ơn bạn đã làm rõ. OP đã hỏi về việc xóa một thẻ duy nhất. Tôi không thể tưởng tượng được tại sao ai đó sẽ sử dụng phương pháp này cho một thẻ. Có lẽ câu trả lời này tốt hơn cho một câu hỏi khác liên quan đến việc xóa nhiều thẻ
theUtherSide

Tôi không nghĩ nó tồn tại. Tôi có thể tạo ra nó để trả lời chính mình. Bạn có muốn nghĩ rằng điều đó là thích hợp?
TonyH

1
Tôi làm! Tôi nghĩ rằng đó là một thực tế khá phổ biến ở đây, thực sự.
theStherSide

6

Các câu trả lời khác chỉ ra làm thế nào để thực hiện điều này, nhưng bạn nên ghi nhớ hậu quả vì đây là một kho lưu trữ từ xa.

Trang man git tag, trong phần On Retagging , có một lời giải thích tốt về cách thông báo lịch sự cho những người dùng khác từ xa về sự thay đổi. Họ thậm chí còn đưa ra một mẫu thông báo tiện dụng để truyền đạt cách người khác nhận được các thay đổi của bạn.


6

Tôi muốn xóa tất cả các thẻ ngoại trừ các thẻ khớp với một mẫu để tôi có thể xóa tất cả trừ vài tháng cuối của thẻ sản xuất, đây là những gì tôi đã sử dụng để thành công lớn:

Xóa tất cả các thẻ từ xa và loại trừ biểu hiện khỏi Xóa

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Xóa tất cả các thẻ cục bộ và loại trừ biểu hiện khỏi Xóa

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

5

Kịch bản đơn giản để loại bỏ thẻ đã cho từ cả hai vị trí địa phương và nguồn gốc. Với một kiểm tra nếu thẻ thực sự tồn tại.

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

Cách sử dụng:

  • Tạo tập tin shell shell (ví dụ git-tag-purge.sh) và dán nội dung.
  • chmod tập tin kịch bản của bạn để làm cho nó thực thi.
  • Làm cho kịch bản có sẵn trên toàn cầu
  • cd cho dự án git của bạn
  • Kịch bản cuộc gọi (ví dụ
    $> git-tag-purge.sh tag_name
    )

4

Có vẻ như rất nhiều công việc cho một cái gì đó xargsđã làm. Nhìn lại chủ đề này, tôi đoán sự chậm chạp xargsmà bạn đã trải qua là vì câu trả lời ban đầu được sử dụng xargs -n 1khi nó không thực sự cần thiết.

Điều này tương đương với phương thức của bạn ngoại trừ việc xargstự động xử lý độ dài dòng lệnh tối đa:

git tag | sorting_processing_etc | xargs git push --delete origin

xargscó thể chạy các quá trình song song quá. Cách 2 với xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

Ở trên sử dụng tối đa 5 quy trình để xử lý tối đa 100 đối số trong mỗi quy trình. Bạn có thể thử nghiệm với các đối số để tìm ra những gì phù hợp nhất với nhu cầu của bạn.


Hấp dẫn. Bạn học được điều gì đó mới về lệnh Unix mỗi ngày. Tôi sẽ cần kiểm tra trường hợp sử dụng của mình với phương án này.
TonyH

4

Nếu bạn có một thẻ được tạo bắt đầu bằng ký tự # , ví dụ: #ST002bạn có thể thấy rằng bạn không thể xóa bằng các mẫu bình thường. I E

git tag -d #STOO2

Sẽ không xóa thẻ, nhưng gói nó trong một chuỗi ký tự như vậy

git tag -d "#ST002" or git tag -d '#ST002'

Điều đó sẽ khiến nó bị xóa. Hy vọng nó sẽ giúp được ai đó mắc lỗi sử dụng # để viết tên thẻ.


2

Dưới đây là một testcase cục bộ để kiểm tra nó cục bộ mà không gây rối với điều khiển từ xa:

~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest

1

Hi chỉ muốn chia sẻ một bí danh tôi đã tạo ra điều tương tự:

Thêm phần sau vào ~ / .gitconfig của bạn

[alias]
    delete-tag = "!f() { \
            echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
            git push --delete origin $1; \
            echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
            git tag -d $1; \
        }; f"

Cách sử dụng trông như sau:

-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)
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.