"git fetch --tags"에 "git fetch"가 포함됩니까?
문제
훌륭하고 간단한 질문입니다. "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%
이는 다음과 같은 상황에만 적용됩니다.
- 클라이언트 측에 만들 팩이 많이 있습니다.
reprepare_packed_git()
비용이 많이 듭니다(가장 비용이 많이 드는 부분은 현재 2차인 정렬되지 않은 목록에서 중복 항목을 찾는 것입니다).- 서버 측에는 자동 팔로우 후보인(즉, 클라이언트에 없는) 태그 참조가 많이 필요합니다.각각은 팩 디렉토리의 다시 읽기를 트리거합니다.
- 일반적인 상황에서 클라이언트는 해당 태그를 자동으로 따르며 한 번의 대규모 가져오기 후에는 (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 fetch
ing and git merge
당신이 점프하기 전에 git pull
단순히 당신이 무엇을 이해하는 데 도움이되기 때문입니다 git pull
처음에하고 있습니다.
즉, 관계는 정확히 동일합니다. git fetch
. git pull
Superset입니다 git pull --tags
.
git fetch upstream --tags
잘 작동하며 새 태그 만 얻을 수 있으며 다른 코드 기반을 얻지 못합니다.