คุณจะลบแท็ก Git ที่ถูกผลักไปแล้วได้อย่างไร?
คุณจะลบแท็ก Git ที่ถูกผลักไปแล้วได้อย่างไร?
คำตอบ:
คุณเพียงแค่ต้องผลักดันการอ้างอิง 'ว่าง' กับชื่อแท็กระยะไกล:
git push origin :tagname
หรือให้ใช้--delete
ตัวเลือกอย่างชัดเจนมากขึ้น(หรือ-d
หากเวอร์ชัน git ของคุณเก่ากว่า 1.8.0):
git push --delete origin tagname
โปรดทราบว่า git มีแท็กเนมสเปซและเนมสเปซของสาขาดังนั้นคุณอาจใช้ชื่อเดียวกันสำหรับสาขาและสำหรับแท็ก หากคุณต้องการให้แน่ใจว่าคุณไม่สามารถลบสาขาแทนแท็กโดยไม่ได้ตั้งใจคุณสามารถระบุการอ้างอิงแบบเต็มซึ่งจะไม่ลบสาขา:
git push origin :refs/tags/tagname
หากคุณต้องการลบแท็กท้องถิ่นให้ใช้:
git tag --delete tagname
การผลักสาขาแท็กหรือการอ้างอิงอื่น ๆ ไปยังที่เก็บระยะไกลเกี่ยวข้องกับการระบุ "ว่า repo แหล่งข้อมูลใดปลายทางใด
git push remote-repo source-ref:destination-ref
ตัวอย่างโลกแห่งความจริงที่คุณผลักสาขาหลักของคุณไปยังสาขาต้นแบบของต้นกำเนิดคือ:
git push origin refs/heads/master:refs/heads/master
ซึ่งเนื่องจากเส้นทางเริ่มต้นสามารถย่อให้เป็น:
git push origin master:master
แท็กทำงานในลักษณะเดียวกัน:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
ซึ่งสามารถย่อให้เป็น:
git push origin release-1.0:release-1.0
ด้วยการละเว้นการอ้างอิงแหล่งที่มา (ส่วนก่อนโคลอน) คุณจะกด 'ไม่มีอะไร' ไปยังปลายทางการลบการอ้างอิงที่ปลายรีโมต
git push --delete origin tag1 tag2
และในกรณีที่มีคนสงสัยว่าจะลบแท็กหลายในเวลาที่คุณรายการที่เรียบง่ายพวกเขาใช้พื้นที่สีขาวเช่น การลบแท็กในเครื่องเดียวกันนั้นสามารถใช้ได้git tag -d tag1 tag2
tag
เชื่อมต่อกับการส่งคำสั่งเดียวเท่านั้น เนื่องจากชื่อสาขานั้นไม่เกี่ยวข้อง
git tag -d `git tag`
จะลบแท็กท้องถิ่นทั้งหมด เช่นเดียวกับการgit push --delete origin `git tag`
สมมติว่าคุณดึงแท็กระยะไกลในเครื่อง นั่นเป็นประโยชน์ในสภาพแวดล้อมการทดสอบ
วิธีที่ตรงไปตรงมามากขึ้นคือ
git push --delete origin YOUR_TAG_NAME
ไวยากรณ์ของโคลอนของ IMO ที่นำหน้าเป็นสิ่งที่แปลกเล็กน้อยในสถานการณ์นี้
git push --delete origin "TAGNAME"
โดย TAGNAME เป็นชื่อของแท็กดั้งเดิม
tag
ก่อนชื่อแท็กของคุณเพื่อให้แน่ใจว่าคุณได้รับแท็กไม่ใช่สาขา
refs/tags/
refs/tags/v2.3.1
หากคุณมีแท็กรีโมตที่v0.1.0
จะลบและรีโมตของคุณเป็นorigin
เพียง:
git push origin :refs/tags/v0.1.0
หากคุณต้องลบแท็กในเครื่องด้วย:
git tag -d v0.1.0
ดูคำตอบของAdam Francoสำหรับคำอธิบายของ:
ไวยากรณ์ที่ผิดปกติของ Git สำหรับการลบ
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...
:tagname
ควรจะทำงานสำหรับการลบระยะไกล
ลบแท็กท้องถิ่นทั้งหมดและรับรายการของแท็กระยะไกล :
git tag -l | xargs git tag -d
git fetch
ลบแท็กระยะไกลทั้งหมด
git tag -l | xargs -n 1 git push --delete origin
ทำความสะอาดแท็กท้องถิ่น
git tag -l | xargs git tag -d
วิธีลบแท็กออกจากที่เก็บรีโมต:
git push --delete origin TAGNAME
คุณอาจต้องการลบแท็กในเครื่อง:
git tag -d TAGNAME
git push --delete origin TAGNAME && git tag -d TAGNAME
จากเทอร์มินัลของคุณทำสิ่งนี้:
git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
ตอนนี้ไปที่ Github.com และรีเฟรชพวกเขาหายไป
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
จากrepo ท้องถิ่นyour_tag_name
จากrepo ระยะไกลgit tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
เพียงสังเกตว่าหากคุณมีชื่อสาขาระยะไกลเป็นแท็กระยะไกลคำสั่งเหล่านี้จะคลุมเครือ:
git push origin :tagname
git push --delete origin tagname
ดังนั้นคุณต้องใช้คำสั่งนี้เพื่อลบแท็ก:
git push origin :refs/tags/<tag>
และอันนี้เพื่อลบสาขา:
git push origin :refs/heads/<branch>
ถ้าไม่คุณจะได้รับข้อผิดพลาดเช่นนี้:
error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
หลังจากอ่านคำตอบเหล่านี้ขณะที่ต้องการลบแท็กมากกว่า 11,000 แท็กฉันเรียนรู้วิธีการเหล่านี้อาศัยหรือxargs
ใช้เวลานานเกินไปเว้นแต่คุณจะมีเวลาเขียน
ดิ้นรนผมพบว่าทั้งสองมากวิธีที่เร็วขึ้น สำหรับทั้งคู่เริ่มต้นด้วยgit tag
หรือgit ls-remote --tags
สร้างรายการแท็กที่คุณต้องการลบบนรีโมท ในตัวอย่างด้านล่างคุณสามารถละเว้นหรือแทนที่sorting_proccessing_etc
ด้วยgrep
ไอsort
เอ็นtail
จีไอเอ็นจีไอเอ็นจีหรือhead
ไอเอ็นจีที่คุณต้องการ ( เช่น grep -P "my_regex" | sort | head -n -200
ฯลฯ ):
xargs
และใช้ได้กับแท็กอย่างน้อยหลายพันครั้งgit push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh
มันทำงานอย่างไร ปกติรายการสายแยกของแท็กจะถูกแปลงเป็นบรรทัดเดียวของแท็กพื้นที่แยกแต่ละใช้ได้กับ:
เพื่อ . .
tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
การใช้git push
แท็กรูปแบบนี้จะไม่ส่งสิ่งใดไปยังรีโมตอ้างอิงแต่ละรายการลบออก (รูปแบบปกติสำหรับการกดด้วยวิธีนี้คือlocal_ref_path:remote_ref_path
)
หลังจากวิธีเหล่านี้ทั้งสองคุณอาจต้องการลบแท็กท้องถิ่นของคุณด้วย นี่คือเร็วกว่ามากเพื่อให้เราสามารถกลับไปใช้xargs
และgit tag -d
ซึ่งเพียงพอ
git tag | sorting_processing_etc | xargs -L 1 git tag -d
หรือคล้ายกับการลบระยะไกล:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
หากคุณใช้ SourceTree ซึ่งเป็น Git GUI ที่ยอดเยี่ยมคุณสามารถทำได้โดยไม่ต้องใช้บรรทัดคำสั่งโดยทำดังต่อไปนี้
YOUR_TAG_NAME จะถูกลบออกจากพื้นที่เก็บข้อมูลในพื้นที่ของคุณและรีโมททั้งหมด - ไม่ว่าจะเป็น GitHub, BitBucket หรือที่ใดก็ตามที่คุณแสดงรายการเป็นรีโมตสำหรับที่เก็บนั้น
นอกจากนี้หากคุณลบแท็กในเครื่อง แต่ไม่ได้อยู่ในต้นกำเนิดระยะไกลและคุณต้องการลบทุกที่ให้สร้างแท็กใหม่ที่มีชื่อเหมือนกันและแนบไว้ที่การกระทำเดียวกันกับต้นกำเนิด จากนั้นทำซ้ำขั้นตอนด้านบนเพื่อลบทุกที่
หากคุณสร้างแท็กชื่อrelease01
ในที่เก็บ Git คุณจะต้องลบออกจากที่เก็บของคุณโดยทำดังต่อไปนี้:
git tag -d release01
git push origin :refs/tags/release01
วิธีลบออกจากที่เก็บ Mercurial:
hg tag --remove featurefoo
โปรดอ้างอิงhttps://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
หากคุณใช้ PowerShell และคุณต้องการลบมันทิ้ง:
# Local tags:
git tag -l | foreach { git tag -d $_ }
# Remote tags:
git tag -l | foreach { git push --delete origin $_ }
แน่นอนคุณสามารถกรองพวกเขาก่อนที่จะลบ:
git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
ตามที่ @CubanX แนะนำฉันได้แยกคำตอบนี้จากต้นฉบับของฉัน:
xargs
และอาจขยายเพิ่มขึ้นหลายเท่าด้วยการปรับแต่ง มันใช้Github API , 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
มีโหมดการทำงานมากมาย แต่โดยทั่วไปแล้วคำสั่งใด ๆ ที่คุณให้ไว้จะขนานกันในขณะที่อนุญาตให้คุณกำหนดขีด จำกัด จำนวนกระบวนการ คุณสามารถแก้ไข--jobs 2
พารามิเตอร์เพื่อให้การทำงานเร็วขึ้น แต่ฉันมีปัญหากับการ จำกัด อัตราของ Github ซึ่งปัจจุบันอยู่ที่ 5,000 / ชม. แต่ก็ดูเหมือนว่าจะมีการ จำกัด ระยะสั้นที่ไม่มีเอกสารเช่นกัน
หลังจากนี้คุณอาจต้องการลบแท็กท้องถิ่นของคุณด้วย นี่คือเร็วกว่ามากเพื่อให้เราสามารถกลับไปใช้xargs
และgit tag -d
ซึ่งเพียงพอ
git tag | sorting_processing_etc | xargs -L 1 git tag -d
คำตอบอื่น ๆ ชี้ให้เห็นวิธีการทำสิ่งนี้ให้สำเร็จ แต่คุณควรคำนึงถึงผลที่จะเกิดขึ้นเนื่องจากนี่เป็นที่เก็บข้อมูลระยะไกล
หน้าแท็ก git ในส่วนOn Retaggingมีคำอธิบายที่ดีเกี่ยวกับการแจ้งผู้ใช้รายอื่นของ repo ทางไกลอย่างสุภาพ พวกเขายังให้แม่แบบประกาศที่มีประโยชน์สำหรับการสื่อสารว่าคนอื่นควรได้รับการเปลี่ยนแปลงของคุณ
ฉันต้องการลบแท็กทั้งหมดยกเว้นแท็กที่ตรงกับรูปแบบเพื่อให้ฉันสามารถลบทั้งหมดยกเว้นแท็กการผลิตสองสามเดือนสุดท้ายนี่คือสิ่งที่ฉันเคยประสบความสำเร็จ:
ลบแท็กระยะไกลทั้งหมด & ไม่รวมนิพจน์จากลบ
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin
ลบแท็กท้องถิ่นทั้งหมดและไม่รวมนิพจน์จากลบ
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
สคริปต์ง่าย ๆ ในการลบแท็กที่กำหนดออกจากทั้งภายในและที่ตั้งต้นทาง ด้วยการตรวจสอบว่าแท็กมีอยู่จริงหรือไม่
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
วิธีใช้:
$> git-tag-purge.sh tag_name)
ดูเหมือนว่าจะมีงานมากสำหรับบางสิ่งบางอย่างxargs
แล้ว เมื่อมองย้อนกลับไปในหัวข้อนี้ฉันคาดเดาความเชื่องช้าของxargs
สิ่งที่คุณเคยพบเพราะคำตอบเดิมที่ใช้xargs -n 1
เมื่อมันไม่จำเป็นต้องใช้จริงๆ
นี่เทียบเท่ากับวิธีการของคุณยกเว้นว่าxargs
จะเกี่ยวข้องกับความยาวบรรทัดคำสั่งสูงสุดโดยอัตโนมัติ:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs
สามารถเรียกใช้กระบวนการในแบบคู่ขนานได้เช่นกัน วิธีที่ 2 ด้วยxargs
:
git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin
ด้านบนใช้กระบวนการสูงสุด 5 กระบวนการเพื่อจัดการอาร์กิวเมนต์สูงสุด 100 ข้อในแต่ละกระบวนการ คุณสามารถทดสอบกับข้อโต้แย้งเพื่อค้นหาสิ่งที่ดีที่สุดสำหรับความต้องการของคุณ
หากคุณมีแท็กที่เริ่มต้นด้วยอักขระ#เช่น#ST002
คุณอาจพบว่า u ไม่สามารถลบโดยใช้รูปแบบปกติ กล่าวคือ
git tag -d #STOO2
จะไม่ลบแท็ก แต่ห่อไว้ในสตริงตัวอักษรเช่นดังนั้น
git tag -d "#ST002" or git tag -d '#ST002'
ที่จะลบมัน หวังว่ามันจะช่วยให้คนที่ทำผิดพลาดจากการใช้#เพื่อเขียนชื่อแท็ก
นี่คือตู้ทดสอบในเครื่องสำหรับทดสอบภายในเครื่องโดยไม่ล้อเล่นกับรีโมท:
~/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
สวัสดีฉันต้องการแบ่งปันนามแฝงที่ฉันสร้างซึ่งทำสิ่งเดียวกัน:
เพิ่มสิ่งต่อไปนี้ใน ~ / .gitconfig ของคุณ
[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"
การใช้งานดูเหมือนว่า:
-->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)