원격 태그를 삭제하는 방법?


답변:


5751

원격 태그 이름에 '빈'참조를 푸시하면됩니다.

git push origin :tagname

또는 더 표현 적으로 --delete옵션을 사용하십시오 (또는 -dgit 버전이 1.8.0보다 오래된 경우).

git push --delete origin tagname

git에는 태그 네임 스페이스와 브랜치 네임 스페이스가 있으므로 브랜치와 태그에 동일한 이름을 사용할 수 있습니다. 태그 대신 실수로 분기를 제거 할 수 없도록하려면 분기를 삭제하지 않는 전체 참조를 지정할 수 있습니다.

git push origin :refs/tags/tagname

로컬 태그도 삭제해야하는 경우 다음을 사용하십시오.

git tag --delete tagname

배경

지점, 태그 또는 기타 참조를 원격 저장소로 푸시하려면 "어떤 저장소, 어떤 소스, 어떤 대상?"을 지정해야합니다.

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

소스 참조 (콜론 앞 부분)를 생략하면 대상에 '아무것도 없음'을 눌러 원격 끝의 참조를 삭제합니다.


187
질문에 대답하고 일반적인 경우를 설명하고, 요약되지 않은 구문의 의미를 자세히 설명하는 +1
Peter Host

77
그리고 누군가가 공백을 사용하여 간단한 태그를 한 번에 여러 태그를 삭제하는 방법을 궁금해하는 경우 (예 :) git push --delete origin tag1 tag2. 로컬 태그 삭제에도 동일git tag -d tag1 tag2
dVaffection

8
태그 이름이 지점 이름과 충돌하면 지점을 삭제하게 될 수 있습니다. ㅋ. 두 번째 답변보기 – 더 친환경적
zuba

1
@EmmaHe A tag는 단일 커밋에만 연결됩니다. 그 때문에 브랜치 이름은 관련이 없습니다.
cb2

1
git tag -d `git tag`모든 로컬 태그가 삭제 된다는 것도 흥미 롭습니다 . git push --delete origin `git tag`원격 태그를 로컬로 가져간 경우 에도 동일하게 적용됩니다 . 테스트 환경에서 편리했습니다.
DarkFranX

382

보다 직접적인 방법은

git push --delete origin YOUR_TAG_NAME

이 상황에서 IMO 접두사 콜론 구문은 약간 이상합니다.


4
나는 이것이 올바른 방법이라고 생각합니다 ... 다른 구문은 나에게 해킹처럼 보입니다.
Luigi R. Viggiano

11
네, 이것은 간단하고 작동합니다. 변수 부분을 지정하여 답을 명확하게 설명하지만 git push --delete origin "TAGNAME"TAGNAME은 원래 태그의 이름입니다.
Teemu Leisti

12
작동합니다. 추가 사항 : 브랜치와 이름이 같은 태그가있는 경우 tag태그 이름 앞에 단어 를 넣어 브랜치가 아닌 태그를 얻을 수 있습니다.
andypaxo

9
@andypaxo 명령이 수행하는 것은 참조 스펙입니다. 올바른 방법은 다음과 refs/tags/같이 태그를 접두어로 사용하는 것 refs/tags/v2.3.1입니다.
p3lim

어떻게 든 원격 서버에서 '잘못된'태그 이름을 만들었습니다. 특수 문자가 있으므로 동기화 할 수 없으므로 제안으로 제거했습니다 .git push --delete origin "service-<default>- 151 ", intellij가 아니라 숨김이 아니라 sourceTree가 아닌 제거 할 수 없습니다. 감사 !
Dmitri Algazin

215

v0.1.0삭제할 원격 태그 가 있고 원격이 origin인 경우 간단히 다음을 수행하십시오.

git push origin :refs/tags/v0.1.0

로컬로 태그를 삭제해야하는 경우 :

git tag -d v0.1.0

Git의 특이한 삭제 구문에 대한 설명은 Adam Franco 의 답변 을 참조하십시오 :.


2
이것은 jgit에서도 작동합니다. : tag 속기는 jgit
rynop에서

나는 fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Chaim Eliyah

3
@ChaimEliyah 당신은 최고의 슬래시를 가지고있을 것입니다. 아마도 당신의 문제 일 것입니다.
Joffrey

5
더 좋은 대답은 분기와 동일한 태그가있는 경우에도 작동하기 때문입니다.
Erik A. Brandstadmoen

:tagname원격 삭제 작업 만하면 됩니다.
Acumenus 2019

106

모든 로컬 태그를 삭제하고 원격 태그 목록을 가져옵니다 .

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

2
로컬 및 원격 저장소에서 모든 태그를 제거하는 방법 이것이 내가 찾던 것입니다, 감사합니다!
Jorge Orpinel

git fetch, remote를 삭제 한 다음 로컬을 정리하고 아름답게 일했습니다!
DiegoRBaquero

느리지 만 가장 간단한
루슨트 폭스

33

원격 저장소에서 태그를 제거하려면 다음을 수행하십시오.

git push --delete origin TAGNAME

태그를 로컬에서 삭제할 수도 있습니다.

git tag -d TAGNAME

한 줄은 이렇게하려면 모두 :git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken

25

터미널에서 다음을 수행하십시오.

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

이제 Github.com으로 가서 새로 고침하면 사라집니다.


3
자식 태그 태그 안함
DSF

23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. 첫 번째 줄 your_tag_name로컬 저장소 에서 삭제 합니다.
  2. 두 번째 줄 your_tag_name원격 저장소 에서 삭제 합니다.
  3. GitHub Releases 섹션 에서 Discard draft 버튼을 누르십시오 .

여기에 이미지 설명을 입력하십시오


2
이 명령은 질문에 대답 할 수 있지만이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다. 답변 방법
Popo

20

로컬 태그 '12345'삭제

git tag -d 12345

원격 태그 '12345'삭제 (예 : GitHub 버전도)

git push origin :refs/tags/12345

대체 접근법

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

여기에 이미지 설명을 입력하십시오


15

원격 태그로 이름 지정된 원격 분기가있는 경우 다음 명령이 모호합니다.

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>'

짧고 간결합니다. MeganZhou와 함께이 게시물은 왜 우리가 문제가 있었는지에 대한 답으로 튀어 나왔습니다. 분기 이름과 태그 이름은 동일했습니다. 로컬 태그를 삭제하고 : refs / tags로 푸시했는데 모두 좋았습니다.
rwheadon

12

수천 개의 원격 태그에 대해 최대 100 배 빠른 방법

11,000 개가 넘는 태그를 삭제 해야하는 동안이 답변을 읽은 후 xargs화상을 입을 시간이 없다면 이 방법에 의존하거나 너무 오래 걸리는 것을 배웠습니다 .

고생하면서 두 가지 빠른 방법을 찾았 습니다. 두 가지 모두로 시작 git tag하거나 git ls-remote --tags리모컨에서 삭제하려는 태그 목록을 만드십시오. 아래 예 sorting_proccessing_etc에서 원하는 greping, sorting, tailing 또는 heading ( 예 : grep -P "my_regex" | sort | head -n -200 )을 생략하거나 대체 할 수 있습니다 .


이 첫 번째 방법은를 사용하는 것보다 20 ~ 100 배 더 빠르며 한 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).

방법 2는 동일한 페이지의 다른 곳에서 별도의 답변으로 나뉩니다 .


이 두 가지 방법을 모두 수행 한 후에는 로컬 태그도 삭제하고 싶을 것입니다. 이것은 훨씬 빠르므로 xargsand 사용으로 다시 돌아갈 수 있습니다 git tag -d.

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

또는 원격 삭제와 유사합니다.

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

이것을 몇 가지 다른 답변으로 나눠야합니다. 한 줄에 여러 태그가있는 대답은 의심 할 여지없이 대량 태그 삭제에 대한 정답입니다. 실제로 거의 다른 곳에서이 정보를 찾기가 약간 어렵습니다. 내가 찾고있는 것을 아는 것조차도 git help page에서 찾는 데 어려움을 겪고 있습니다. :) 여러분에게 도움이되고 올바른 답변으로 강조 표시하고 GitHub API를 다른 곳으로 옮깁니다. 마지막으로, 로컬에서 삭제 태그를 일괄 적으로 사용하면 공백으로 구분 된 태그 (콜론 제거)와 작동합니다.
CubanX

칭찬과 제안에 감사드립니다. 나는 이것을 나눌 것이다. 로컬 태그 삭제에 대한 귀하의 의견을 이해하지 못합니다. 내 최종 명령 스 니펫에 콜론이 사용되지 않는다고 생각하지만 모바일에 있으므로 뭔가 빠진 것 같습니다.
TonyH

죄송합니다. 원격 태그를 삭제하기 위해하는 일이 로컬 태그를 삭제하고 전체 목록을 한 번에 제공하는 것입니다. :) git push origin : tag1 : tag2 등 대신 git tag --tag1 tag2 tag3을 삭제하면 전체 정리가 가능합니다. 다시 한번, 감사합니다!
CubanX

11

훌륭한 Git GUI 인 SourceTree를 사용하는 경우 다음을 수행하여 명령 줄없이 쉽게 수행 할 수 있습니다.

  1. SourceTree에서 저장소를여십시오
  2. 왼쪽의 '태그'탭을 선택하고 펼치십시오.
  3. 삭제하려는 태그를 마우스 오른쪽 버튼으로 클릭하십시오
  4. "Your_TAG_NAME 삭제"를 선택하십시오.
  5. 확인 창에서 "원격에서 태그 제거"를 선택하십시오.

이제 Your_TAG_NAME이 로컬 리포지토리 및 모든 원격지 (GitHub, BitBucket 또는 해당 리포지토리의 원격으로 나열된 곳)에서 제거됩니다.

또한 로컬에서 태그를 삭제했지만 원격 원점에서는 삭제하지 않고 모든 위치에서 삭제하려는 경우 동일한 이름을 가지며 원점과 동일한 커밋에 첨부 된 새 태그를 작성하십시오. 그런 다음 위의 단계를 반복하여 모든 위치를 삭제하십시오.


매력처럼 작동합니다. 감사!
Native_Mobile_Arch_Dev


7

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 $_ }

그것은 부드럽고 좋은 정규 표현식 예입니다. 감사합니다 좋은 선생님
Yunus

7

@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더 빠른 작업을 허용하도록 매개 변수를 변경할 수 있지만 현재 5000 / hr 인 Github의 속도 제한에 문제가 있었지만 문서화되지 않은 단기 제한도있는 것 같습니다.


그런 다음 로컬 태그도 삭제하고 싶을 것입니다. 이것은 훨씬 빠르므로 xargsand 사용으로 다시 돌아갈 수 있습니다 git tag -d.

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

이것은 허용되는 대답보다 훨씬 더 복잡해 보입니다. 이점은 무엇입니까?
TheUtherSide

2
수천 개의 태그를 삭제해야하는 경우 속도가 10-100 배 빠릅니다.
TonyH

설명해 주셔서 감사합니다. OP는 단일 태그 삭제에 대해 질문했습니다. 왜 누군가가 단일 태그에이 접근 방식을 사용하는지 상상할 수 없었습니다. 아마도이 답변은 많은 태그를 삭제하는 것과 관련된 또 다른 질문에 더 낫습니다
theUtherSide

나는 그것이 존재한다고 생각하지 않습니다. 나는 스스로 대답하기 위해 그것을 만들 수 있었다. 그것이 적절하다고 생각하십니까?
TonyH

1
나는한다! 실제로는 이것이 일반적인 관행이라고 생각합니다.
theUtherSide

6

다른 답변은 이것을 달성하는 방법을 지적하지만 이것이 원격 저장소이기 때문에 결과를 명심해야합니다.

태그 재 지정 섹션 의 git 태그 매뉴얼 페이지 에는 원격 저장소의 다른 사용자에게 변경 사항을 정중하게 알리는 방법에 대한 설명이 있습니다. 또한 다른 사람들이 어떻게 변경을해야하는지 알려주는 편리한 발표 템플릿을 제공합니다.


6

패턴과 일치하는 태그를 제외한 모든 태그를 제거하여 지난 몇 달 동안의 생산 태그를 제외한 모든 태그를 삭제할 수있었습니다.

모든 원격 태그 삭제 및 삭제에서 표현식 제외

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

5

로컬 및 출발지 위치에서 지정된 태그를 제거하는 간단한 스크립트입니다. 태그가 실제로 존재하는지 확인하십시오.

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)을 작성하고 내용을 붙여 넣습니다.
  • chmod 스크립트 파일을 실행 가능하게 만드십시오.
  • 스크립트를 전 세계적으로 사용 가능하게하십시오
  • git 프로젝트로 cd
  • 통화 스크립트 (예 :
    $> git-tag-purge.sh tag_name
    )

4

xargs이미 많은 일을하는 것처럼 보입니다 . 이 실을 되돌아 보면, xargs당신이 경험 했던 속도가 느려질 것입니다. 왜냐하면 원래의 대답 xargs -n 1은 실제로 필요하지 않았기 때문입니다.

이것은 xargs최대 명령 줄 길이 를 자동으로 처리 한다는 점을 제외하고는 방법 1 과 같습니다.

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 개의 인수를 처리합니다. 당신은 당신의 요구에 가장 적합한 것을 찾기 위해 논쟁을 실험 할 수 있습니다.


흥미 롭군 매일 유닉스 명령에 대해 새로운 것을 배웁니다. 이 대안으로 유스 케이스를 테스트해야합니다.
TonyH

4

예를 들어 # 문자로 시작하는 태그가 생성 된 경우 #ST002일반적인 패턴으로는 u를 삭제할 수 없습니다. 즉

git tag -d #STOO2

태그를 삭제하지만, 그것을 포장하지 않습니다 문자열 리터럴 과 같이

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

삭제됩니다. # 을 사용하여 태그 이름을 쓰는 실수를 저지른 사람에게 도움이되기를 바랍니다 .


2

다음은 원격 장치를 망칠 필요없이 로컬로 테스트하는 로컬 테스트 사례입니다.

~/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

안녕하세요, 방금 만든 별칭을 공유하고 싶었습니다.

~ / .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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.