Làm thế nào để bạn xóa một thẻ Git đã được đẩy?
Làm thế nào để bạn xóa một thẻ Git đã được đẩy?
Câu trả lời:
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 --delete
tùy chọn (hoặc -d
nế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
Đẩ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.
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
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.
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.
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
git push --delete origin "TAGNAME"
trong đó TAGNAME là tên của thẻ gốc.
tag
trướ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.
refs/tags/
, như thế này : refs/tags/v2.3.1
.
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.
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?
:tagname
nên làm việc cho việc xóa từ xa.
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
Để 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
git push --delete origin TAGNAME && git tag -d TAGNAME
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.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
từ repo địa phương .your_tag_name
từ repo từ xa .git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
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>'
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 xargs
mấ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 tag
hoặ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_etc
bằng bất kỳ grep
ing, sort
ing, tail
ing hoặc head
ing nào bạn muốn ( ví dụ: grep -P "my_regex" | sort | head -n -200
v.v. ):
xargs
và 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 push
vớ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
).
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 xargs
và git 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 " ")
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:
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.
Nếu bạn đã tạo một thẻ được gọi release01
trong kho Git, bạn sẽ xóa thẻ đó khỏi kho lưu trữ của mình bằng cách thực hiện như sau:
git tag -d release01
git push origin :refs/tags/release01
Để xóa một tệp khỏi kho lưu trữ Mercurial:
hg tag --remove featurefoo
Vui lòng tham khảo https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
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 $_ }
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:
xargs
và 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\"`
parallel
có 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 2
tham 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 xargs
và git tag -d
, là đủ.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
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.
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
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:
$> git-tag-purge.sh tag_name)
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 xargs
mà bạn đã trải qua là vì câu trả lời ban đầu được sử dụng xargs -n 1
khi 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 xargs
tự động xử lý độ dài dòng lệnh tối đa:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs
có 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.
Nếu bạn có một thẻ được tạo bắt đầu bằng ký tự # , ví dụ: #ST002
bạ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ẻ.
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
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)