programing

더 이상 원격 저장소에 없는 로컬 Git 태그 제거

starjava 2023. 4. 27. 21:44
반응형

더 이상 원격 저장소에 없는 로컬 Git 태그 제거

배포 프로세스의 일부로 태그 git을 사용합니다.원격 저장소에서 태그를 제거하여 이러한 태그를 정리할 수도 있습니다.

이것은 꽤 간단합니다.한 명의 사용자가 하나의 명령 집합에서 로컬 태그와 원격 태그를 삭제합니다.두 단계를 결합한 작은 셸 스크립트가 있습니다.

이제 두 번째(3번째, 4번째, ...) 사용자에게는 더 이상 원격에 반영되지 않는 로컬 태그가 있습니다.

다음과유사명찾있습다니고령을한▁▁similar와 비슷한 를 찾고 .git remote prune origin그러면 원격 분기가 삭제된 로컬 추적 분기가 정리됩니다.

또는 원격 태그를 나열하는 간단한 명령을 사용하여 다음을 통해 반환되는 로컬 태그와 비교할 수 있습니다.git tag -l.

이것은 훌륭한 질문입니다. 저도 같은 질문을 하고 있었습니다.

저는 대본을 쓰고 싶지 않아서 다른 해결책을 찾았습니다.중요한 것은 태그를 로컬로 삭제한 다음 gitfetch를 사용하여 원격 서버에서 "다시 가져오기"할 수 있다는 것입니다.원격에 태그가 없으면 삭제된 상태로 유지됩니다.

따라서 두 줄을 순서대로 입력해야 합니다.

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

다음 항목:

  1. 로컬 저장소에서 모든 태그를 삭제합니다.FWIW, xargs는 "tag -l"에 의해 출력되는 각 태그를 "tag -d"에 대한 명령줄에 배치합니다.이것이 없으면 git은 stdin(silly git)을 읽지 않기 때문에 아무것도 삭제하지 않습니다.

  2. 원격 저장소에서 모든 활성 태그를 가져옵니다.

이 기능은 Windows에서도 사용할 수 있습니다.

Git v1.7.8에서 v1.8.5.6까지 다음을 사용할 수 있습니다.

git fetch <remote> --prune --tags

갱신하다

이는 commit e66ef7ae6f31f2 때문에 최신 버전의 git(v1.9.0 이후)에서는 작동하지 않습니다.일부 사람들에게는 효과가 있었기 때문에 삭제하고 싶지 않습니다.

"Chad Juliano"에서 제안한 대로 v1.7.8 이후 모든 Git 버전에서 다음 명령을 사용할 수 있습니다.

git fetch --prune <remote> +refs/tags/*:refs/tags/*

와일드카드 확장을 방지하려면 태그 부분을 따옴표로 묶어야 할 수 있습니다(예: Windows).

git fetch --prune <remote> "+refs/tags/*:refs/tags/*"

참고: 이러한 모든 경우에 "원본" 또는 일반적으로 참조할 수 있는 원격이 있을 수 있습니다.

최근 버전의 Git(I'm on git v2.20)처럼 보이지만, 간단히 말할 수 있습니다.

git fetch --prune --prune-tags

훨씬 깨끗합니다!

https://git-scm.com/docs/git-fetch#_pruning

또한 다음을 가져올 때 태그를 항상 잘라내도록 git를 구성할 수 있습니다.

git config fetch.pruneTags true

원격에서 때 에는 원격서가때태자수있를다습니그를을 할 수 .remote.<remote>.pruneTags를 들어를 항상 경우, "frunch", "frunch", "frunch", "frunch",

git config remote.origin.pruneTags true

원격에 있는 태그만 사용하려면 로컬 태그를 모두 삭제하십시오.

$ git tag -d $(git tag)

그런 다음 모든 원격 태그를 가져옵니다.

$ git fetch --tags

이후 은 v1.7.8 Git를 합니다.git fetch, 0 이후 refspec은 v1.9.0입니다.--tags은 은옵다을재니다합의정음션을 합니다.--prune선택. 의 경우 .범용 솔루션의 경우 다음을 시도해 보십시오.

$ git --version
git version 2.1.3

$ git fetch --prune origin "+refs/tags/*:refs/tags/*"
From ssh://xxx
 x [deleted]         (none)     -> rel_test

Git v1.9.0에서 "--prune" 동작이 포함된 "--pune"가 어떻게 변경되었는지에 대한 자세한 내용은 https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c 을 참조하십시오.

좋은 질문입니다.:) 저는 완전한 답을 가지고 있지 않습니다...

은 원격태목통얻수있다습니을을 통해 수 .git ls-remote에서 참조하는 리포지토리의 태그를 나열하려면 다음과 같이 하십시오.origin실행할 수 있습니다.

git ls-remote --tags origin

그러면 해시 목록과 다음과 같은 친숙한 태그 이름이 반환됩니다.

94bf6de8315d9a7b22385e86e1f5add9183bcb3c        refs/tags/v0.1.3
cc047da6604bdd9a0e5ecbba3375ba6f09eed09d        refs/tags/v0.1.4
...
2f2e45bedf67dedb8d1dc0d02612345ee5c893f2        refs/tags/v0.5.4

bash 스크립트를 조합하여 이 목록에서 생성된 태그를 로컬로 가지고 있는 태그와 비교할 수 있습니다..git show-ref --tags는 태그 을 다과같형태이그생름성다와 한 합니다.git ls-remote).


외에도, 외에그,git show-ref원하는 것과 반대의 옵션이 있습니다.다음 명령은 로컬에 없는 원격 분기의 모든 태그를 나열합니다.

git ls-remote --tags origin | git show-ref --tags --exclude-existing

새 Git 버전(예: v2.26.2 이상)에서는

-P
-- 가지치기를 좋아하는 독자
전에 에 존재하지 않는 합니다.--prune활성됩니다화.은옵보신합사니와 달리 좀 .--prune생성된 로컬 참조(로컬 태그)를 제거합니다. 명시적 태그 refspec을 입니다.--prune문서에서 이에 대한 논의를 참조하십시오.

따라서 다음을 실행해야 합니다.

git fetch origin --prune --prune-tags

Git는 기본적으로 로컬 태그 정리를 지원합니다.

git fetch --tags --prune-tags

이 명령은 최신 태그를 가져오고 삭제된 모든 태그를 제거합니다.

제가 파티에 늦었다는 것은 알지만, 이제 이것에 대한 빠른 대답이 있습니다.

git fetch --prune --prune-tags # or just git fetch -p -P

예, 이제 가져올 수 있는 옵션입니다.

가져오기를 원하지 않고 가지치기만 하면 됩니다.

git remote prune origin

이것은 좋은 방법입니다.

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

출처: demisx.GitHub.io

@2021/05 업데이트

여기에 이미지 설명 입력

통과하다$REPO사용자 지정 스크립트에 대한 매개 변수입니다.

의 내용sync_git_tags.sh

#!/bin/sh

# cd to $REPO directory
cd $1
pwd

# sync remote tags
git tag -l | xargs git tag -d && git fetch -t

늙은

ps: @ssh/05 업데이트됨,git fetch --prune --prune-tags originMacOS에서 작동하지 않습니다.

에 명령을 추가합니다.SourceTree사용자 지정 작업으로 사용할 수 있습니다.
설정Custom Actions타고Sourcetree->Preferences...->Custom Actions


`Script to run` have to be the `git` path.

사용합니다git fetch --prune --prune-tags origin태그를 원격에서 로컬로 동기화합니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력

@Richard W와 동일하지만 Windows(PowerShell)의 경우

git tag | ForEach-Object -Process { git tag -d $_ }
git fetch -t

로컬 태그와 원격 태그의 차이를 표시합니다.

diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort)
  • git tag로컬 태그 목록을 제공합니다.
  • git ls-remote --tags원격 태그에 대한 전체 경로 목록을 제공합니다.
  • cut -f2 | grep -v '\^' | sed 's#refs/tags/##'원격 태그 경로 목록에서 태그 이름만 구문 분석합니다.
  • 마지막으로 우리는 두 리스트를 각각 분류하고 그것들을 나눕니다.

"<"로 시작하는 행은 더 이상 원격 저장소에 없는 로컬 태그입니다.수가 적으면 하나씩 수동으로 제거할 수 있으며, 수가 많으면 더 많은 그리핑과 파이프 작업을 수행하여 자동화할 수 있습니다.

GitHub의 pivotal_git_scripts Gemfork에 git sync-local-tags 명령을 추가했습니다.

https://github.com/kigster/git_scripts

Gem을 설치한 다음 저장소에서 "git sync-local-tags"를 실행하여 원격에 없는 로컬 태그를 삭제합니다.

또는 아래에 이 스크립트를 설치하고 "git-sync-local-tags"라고 부를 수 있습니다.


#!/usr/bin/env ruby

# Delete tags from the local Git repository, which are not found on 
# a remote origin
#
# Usage: git sync-local-tags [-n]
#        if -n is passed, just print the tag to be deleted, but do not 
#        actually delete it.
#
# Author: Konstantin Gredeskoul (http://tektastic.com)
#
#######################################################################

class TagSynchronizer
  def self.local_tags
    `git show-ref --tags | awk '{print $2}'`.split(/\n/)
  end

  def self.remote_tags
    `git ls-remote --tags origin | awk '{print $2}'`.split(/\n/)
  end

  def self.orphaned_tags
    self.local_tags - self.remote_tags
  end

  def self.remove_unused_tags(print_only = false)
    self.orphaned_tags.each do |ref|
      tag = ref.gsub /refs\/tags\//, ''
      puts "deleting local tag #{tag}"
      `git tag -d #{tag}` unless print_only
    end
  end
end

unless File.exists?(".git")
  puts "This doesn't look like a git repository."
  exit 1
end

print_only = ARGV.include?("-n")
TagSynchronizer.remove_unused_tags(print_only)

이것은 어떻습니까? 모든 로컬 태그를 삭제한 후 다시 가져오시겠습니까?보고서에 하위 모듈이 포함되어 있을 수 있다는 점을 고려합니다.

git submodule foreach --recursive  'git tag | xargs git tag -d'
(alternatively, "for i in `find .git  -type d -name '*tags*'`; do rm -f $i/*;  done")
git fetch -t
git submodule foreach --recursive git fetch -t

TorothyGit는 이제 태그를 비교할 수 있습니다.

왼쪽 로그는 원격에 있고 오른쪽 로그는 로컬에 있습니다.

여기에 이미지 설명 입력

동기화 대화 상자의 태그 비교 기능 사용:

여기에 이미지 설명 입력

TorothyGit 2973호도 참조.

언급URL : https://stackoverflow.com/questions/1841341/remove-local-git-tags-that-are-no-longer-on-the-remote-repository

반응형