문제

훌륭하고 간단한 질문입니다. "git fetch" 기능은 엄격한 하위 집합입니까? git fetch --tags?

즉.내가 달리면 git fetch --tags, 즉시 실행해야 할 이유가 있나요? git fetch 곧바로?

는 어때 git pull 그리고 git pull --tags?같은 상황인가요?

도움이 되었습니까?

해결책

메모:로 시작 자식 1.9/2.0(2014년 1분기), git fetch --tags 태그를 가져옵니다 게다가 옵션 없이 동일한 명령줄로 가져오는 항목입니다.

보다 c5a84e9 커밋 ~에 의해 마이클 해거티(Mhagger):

이전에는 fetch의 "--tags" 옵션은 refspec을 지정하는 것과 동일한 것으로 간주되었습니다.

refs/tags/*:refs/tags/*

명령줄에서;특히, 이로 인해 remote.<name>.refspec 무시할 구성입니다.

그러나 다른 참조도 가져오지 않고 태그를 가져오는 것은 별로 유용하지 않습니다. ~이다 태그를 가져올 수 있어서 매우 유용합니다. 게다가 다른 참고자료.
따라서 후자를 수행하도록 이 옵션의 의미를 변경하십시오.

사용자가 가져오려는 경우 오직 태그가 있는 경우에도 명시적인 참조 사양을 지정할 수 있습니다.

git fetch <remote> 'refs/tags/*:refs/tags/*'

1.8.0.3 이전 문서에서는 "fetch --tags" 행동.
f0cb2f1 커밋 (2012-12-14) fetch --tags 문서를 이전 동작과 일치하게 만들었습니다.
이 커밋은 새로운 동작에 맞게 문서를 변경합니다(참조: Documentation/fetch-options.txt).

모든 태그를 원격에서 가져오도록 요청 가져오는 다른 것 외에도.


Git 2.5 이후(2015년 2분기) git pull --tags 더 강력합니다.

보다 19d122b를 커밋하다 ~에 의해 폴 탄(pyokagan), 2015년 5월 13일.
(병합자: 주니오 C 하마노 -- gitster -- ~에 cc77b99 커밋, 2015년 5월 22일)

pull:제거하다 --tags 병합 후보가 없는 경우 오류

부터 441ed41 ("git pull --tags":더 나은 메시지로 오류가 발생합니다., 2007-12-28, 힘내 1.5.4+), git pull --tags 다음과 같은 경우 다른 오류 메시지가 인쇄됩니다. git-fetch 병합 후보를 반환하지 않았습니다.

It doesn't make sense to pull all tags; you probably meant:
       git fetch --tags

그 이유는 바로 그 당시, git-fetch --tags 구성된 refspec을 무시하므로 병합 후보가 없습니다.따라서 혼동을 방지하기 위해 오류 메시지가 도입되었습니다.

그러나 이후 c5a84e9 (fetch --tags:태그 가져오기 게다가기타 내용, 2013-10-30, Git 1.9.0+), git fetch --tags 또한 태그를 가져옵니다. 구성된 모든 refspecs에.
따라서 병합 후보가 없는 상황이 발생하더라도 이는 다음과 같은 이유 때문이 아닙니다. --tags 설정되었습니다.따라서 이 특별한 오류 메시지는 이제 관련이 없습니다.

혼동을 방지하려면 이 오류 메시지를 제거하세요.


Git 2.11+ 사용(2016년 4분기) git fetch 더 빠릅니다.

보다 커밋 5827a03 (2016년 10월 13일) 제프 킹(peff).
(병합자: 주니오 C 하마노 -- gitster -- ~에 9fcd144 커밋, 2016년 10월 26일)

fetch:"빠른"을 사용하세요 has_sha1_file 태그 팔로우를 위해

우리가 따르는 브랜치와 관련 없는 많은 태그가 있는 리모트에서 가져올 때 태그가 가리키는 객체(가져오지 않을!)가 저장소에 있는지 확인하는 데 너무 많은 사이클을 낭비했습니다. 너무 조심스럽게.

이 패치는 Fetch에게 HAS_SHA1_QUICK를 사용하여 속도에 대한 정확도를 희생하여 동시 재 포장을 할 수있는 경우를 가르칩니다.

다음은 위에서 설명한 것과 유사한 상황을 설정하는 포함된 perf 스크립트의 결과입니다.

Test            HEAD^               HEAD
----------------------------------------------------------
5550.4: fetch   11.21(10.42+0.78)   0.08(0.04+0.02) -99.3%

이는 다음과 같은 상황에만 적용됩니다.

  1. 클라이언트 측에 만들 팩이 많이 있습니다. reprepare_packed_git() 비용이 많이 듭니다(가장 비용이 많이 드는 부분은 현재 2차인 정렬되지 않은 목록에서 중복 항목을 찾는 것입니다).
  2. 서버 측에는 자동 팔로우 후보인(즉, 클라이언트에 없는) 태그 참조가 많이 필요합니다.각각은 팩 디렉토리의 다시 읽기를 트리거합니다.
  3. 일반적인 상황에서 클라이언트는 해당 태그를 자동으로 따르며 한 번의 대규모 가져오기 후에는 (2)가 더 이상 true가 아닙니다.
    그러나 해당 태그가 클라이언트가 가져오는 것과 연결이 끊어진 기록을 가리키는 경우 자동으로 따르지 않으며 해당 후보는 모든 가져오기에 영향을 미칩니다.

힘내 2.21(2월.2019) 회귀를 도입한 것으로 보입니다. 구성 remote.origin.fetch ~이다 ~ 아니다 기본 것 ('+refs/heads/*:refs/remotes/origin/*')

fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed

다른 팁

참고 :이 답변은 git v1.8 이상에만 유효합니다.

이 중 대부분은 다른 답변과 의견에서 언급되었지만 여기에 간결한 설명이 있습니다.

  • git fetch 모든 분기 헤드 (또는 Remote.fetch Config 옵션으로 지정된 모든)를 가져오고, 모든 것이 필요로합니다. 대부분의 경우 모든 태그는 이러한 방식으로 도달 할 수 있습니다.
  • git fetch --tags 모든 태그를 가져 오면 필요한 모든 태그를 사용합니다. 그것은 할 것입니다 ~ 아니다 분기 헤드가 가져온 태그에서 도달 할 수있는 경우에도 업데이트하십시오.

요약 : 실제로 최신 상태가 되려면 Fetch 만 사용하려면 두 가지를 모두 수행해야합니다.

명령 줄에 입력하는 관점에서 의미가 없다면 "두 번 느리게"가 아닙니다.이 경우 별명이 문제를 해결합니다. 다른 정보를 요구하기 때문에 두 가지 요청을하는 데는 본질적으로 오버 헤드가 없습니다.

나는 이것을 직접 대답 할 것이다.

차이가 있다고 결정했습니다. "git fetch -tags"는 모든 태그를 가져올 수 있지만 새로운 커밋을 가져 오지는 않습니다!

이 작업을 완전히 "최신"로 만들어야한다는 것이 밝혀졌으며, 즉 병합없이 "git pull"을 복제했습니다.

$ git fetch --tags
$ git fetch

이것은 두 배나 느리기 때문에 부끄러운 일입니다. "git fetch"만이 평소에하는 일을 할 수있는 옵션이 있다면 그리고 모든 태그를 가져 오십시오.

여기서 일반적인 문제는 그 것입니다 git fetch 가져올 것입니다 +refs/heads/*:refs/remotes/$remote/*. 이 커밋 중 하나라도 태그가 있으면 해당 태그도 가져옵니다. 그러나 리모컨의 지점에서는 도달 할 수없는 태그가 있으면 가져 오지 않습니다.

그만큼 --tags 옵션은 refspec을 전환합니다 +refs/tags/*:refs/tags/*. 너 ~할 수 있었다 물어보기 git fetch 둘 다 잡아. 나는 그냥 할 것이라고 확신합니다 git fetch && git fetch -t 다음 명령을 사용합니다.

git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"

이 repo의 기본값을 만들고 싶다면 기본 페치에 두 번째 refscec을 추가 할 수 있습니다.

git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"

두 번째가 추가됩니다 fetch = 라인 .git/config 이 리모컨의 경우.


나는 프로젝트를 위해 이것을 처리 할 수있는 방법을 찾기 위해 잠시 시간을 보냈다. 이것이 제가 생각해 낸 것입니다.

git fetch -fup origin "+refs/*:refs/*"

제 경우에는 이러한 기능을 원했습니다

  • 리모컨에서 모든 헤드와 태그를 잡으므로 RefSpec을 사용하십시오. refs/*:refs/*
  • 비정규적인 지점으로 로컬 브랜치와 태그를 덮어 씁니다 + RefSpec 전에
  • 필요한 경우 현재 체크 아웃 지점을 덮어 씁니다 -u
  • 분기와 태그를 원격으로 표시하지 않습니다 -p
  • 그리고 확실하게 강제 -f

대부분의 상황에서 git fetch '원격 저장소에서 새로운 것을 얻고 현지 지점과 병합하지 않고 로컬 사본에 넣는 것'입니다. git fetch --tags 새로운 태그를 제외하고는 아무것도 얻지 못한다는 점을 제외하고는 정확히 그렇게합니다.

그런 의미에서, git fetch --tags 결코 슈퍼 세트가 아닙니다 git fetch. 실제로는 정확히 반대입니다.

git pull, 물론, 래퍼 일뿐입니다. git fetch <thisrefspec>; git merge. 매뉴얼을하는 데 익숙해지는 것이 좋습니다. git fetching and git merge당신이 점프하기 전에 git pull 단순히 당신이 무엇을 이해하는 데 도움이되기 때문입니다 git pull 처음에하고 있습니다.

즉, 관계는 정확히 동일합니다. git fetch. git pull Superset입니다 git pull --tags.

git fetch upstream --tags

잘 작동하며 새 태그 만 얻을 수 있으며 다른 코드 기반을 얻지 못합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top