답변:
원격 태그 이름에 '빈'참조를 푸시하면됩니다.
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
지점, 태그 또는 기타 참조를 원격 저장소로 푸시하려면 "어떤 저장소, 어떤 소스, 어떤 대상?"을 지정해야합니다.
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
Git의 특이한 삭제 구문에 대한 설명은 Adam Franco 의 답변 을 참조하십시오 :
.
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 tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
은 로컬 저장소 에서 삭제 합니다.your_tag_name
은 원격 저장소 에서 삭제 합니다.원격 태그로 이름 지정된 원격 분기가있는 경우 다음 명령이 모호합니다.
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
ing, sort
ing, tail
ing 또는 head
ing ( 예 : 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
and 사용으로 다시 돌아갈 수 있습니다 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 GUI 인 SourceTree를 사용하는 경우 다음을 수행하여 명령 줄없이 쉽게 수행 할 수 있습니다.
이제 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
더 빠른 작업을 허용하도록 매개 변수를 변경할 수 있지만 현재 5000 / hr 인 Github의 속도 제한에 문제가 있었지만 문서화되지 않은 단기 제한도있는 것 같습니다.
그런 다음 로컬 태그도 삭제하고 싶을 것입니다. 이것은 훨씬 빠르므로 xargs
and 사용으로 다시 돌아갈 수 있습니다 git tag -d
.
git tag | sorting_processing_etc | xargs -L 1 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
최대 명령 줄 길이 를 자동으로 처리 한다는 점을 제외하고는 방법 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 개의 인수를 처리합니다. 당신은 당신의 요구에 가장 적합한 것을 찾기 위해 논쟁을 실험 할 수 있습니다.
다음은 원격 장치를 망칠 필요없이 로컬로 테스트하는 로컬 테스트 사례입니다.
~/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)