git 얕은 클론 (clone --depth)이 원격 분기를 놓친다


99

원격 저장소를 복제 한 후 -a 옵션으로 원격 분기를 표시하지 않습니다. 무엇이 문제일까요? 디버그하는 방법? 이 스 니펫에서는 두 개의 원격 분기가 표시되지 않습니다.

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

다른 컴퓨터에서 동일한 명령을 시도했지만 잘 작동합니다.

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

다른 저장소를 복제하려고 시도했지만 잘 작동합니다. 이 컴퓨터에서 다시 시도해 볼 수는 있지만 무엇이 잘못되었는지 아는 것이 좋습니다.

어떤 제안이나 힌트도 환영받을 것입니다.

편집 : 답변 요약 : git 버전 1.8.3.2부터 "--depth"및 "--no-single-branch"를 함께 사용하여 이전과 동일한 동작을 수행해야합니다. 이것은 버그 수정으로 간주됩니다.


3
master귀하의 지역 지점입니다. remotes/origin/master해당하는 원격 분기입니다. 질문이 정확히 무엇입니까?
michas

1
장황함을 잊으 셨나요? 시도git branch -avv
jthill 2014 년

michas 등에 게 : 우리는 일반적으로 master를 브랜치로 부르지 않습니다. 혼동을 드려 죄송합니다. "두 개의 원격 분기가 표시되지 않음"을 추가했습니다. jthill에게 : 상기시켜 주셔서 감사합니다.
minghua

1
소개해 주셔서 감사합니다. git clone --depth=1 --no-single-branch이것이 제가 대부분의 경우에 필요한 것입니다.
Alireza Mohamadi

답변:


62

마지막 개정 이후 마스터 브랜치는 저장소에서 유일한 원격 브랜치입니다 (기본 원격의 HEAD이므로) 동작은 정확합니다.

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master

전체 클론은 새로운 (모든) 분기를 제공합니다.

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

얕은 클론

기술 문서 의 얕은 설명 으로 인해 " git-clone --depth 20 repo[...] result [s in] 커밋 체인은 최대 20 개 길이입니다." 따라서 얕은 클론에는 분기 끝에서 요청 된 커밋 깊이가 포함되어야합니다.

또한- 옵션 에 git clone대한 문서는 다음 을 --single-branch설명합니다.

"복제는 역사 중 하나에 의해 지정된 단일 지점의 끝을 선도 --branch옵션 또는 기본 분기 원격의 HEAD에서 포인트. 와 얕은 클론을 생성 할 때 --depth않는 옵션을,이 기본입니다 --no-single-branch가까운 이력을 가져 주어집니다 모든 지점의 팁. "

따라서 얕은의 클론 ( 깊이 - 옵션은)만을 가져옵니다하나의 지점 (요청한 깊이).


불행히도 두 가지 옵션 ( --depth--single-branch)은 과거에 결함이 있었고 얕은 클론을 사용하면 주어진 기록 다시 쓰기로 인해 발생하는 해결되지 않은 문제가 암시됩니다 (위에 게시 한 링크에서 읽을 수 있음). 이로 인해 전체적으로 특수한 경우 다소 복잡한 동작이 발생합니다.


1
florianb : git 버전은 무엇입니까? 사용해 주셔서 감사합니다. 1.7.1에서 --depth 1을 수행했습니다. 지금은 모든 원격 분기를 보여줍니다. 이것으로 질문을 업데이트했습니다. 문제 확인을 위해 +1합니다.
minghua

1
@minghua : 저는 1.8.4를 사용하고 있습니다.이 문제에 대한 패치가 있다면 조금 조사하겠습니다.
Florian Neumann

1
@minghua : "얕은 클론"에 대한 새로운 발견을 반영하기 위해 편집했습니다.
Florian Neumann

1
한 가지만 제외하면 거의 완벽합니다. "저장소 소유자가 다른 지점을 잘라내기로 결정했습니다"라는 말은 무엇을 의미합니까? 나는 그 가지가 아직 거기에 있다고 생각합니다.
minghua

2
--no-single-branch는 또한 모든 태그를 복제합니다. 동일한 구성을 사용하여 모든 원격을 가져오고 fetch = +refs/heads/*:refs/remotes/origin/*실행 git fetch --depth 1(없이 --tags) 하여 새 저장소를 생성하여이를 방지 할 수 있습니다 . 다음과 같은 구성을 사용하여 가져올 특정 태그를 추가 할 수도 있습니다 fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0.
Sam Watkins

208

얕은 복제를 수행 한 후 원격에서 다른 분기체크 아웃 할 수 있습니다 .

  1. 실행 (@jthill에게 감사) :

    git remote set-branches origin '*'
    
  2. 그 후, git fetch -v

  3. 드디어 git checkout the-branch-i-ve-been-looking-for


1 단계는를 편집하여 수동으로 수행 할 수도 있습니다 .git/config.

예를 들어 다음 줄을 다음에서 변경하십시오.

fetch = +refs/heads/master:refs/remotes/origin/master

에 (교체 master와 함께 *) :

fetch = +refs/heads/*:refs/remotes/origin/*

57
또한 git remote set-branches origin '*'모든 분기에 사용할 수 *있으며을 하나 의 분기 이름으로 바꿀 수도 있습니다 .
jthill 2014

감사합니다! 이것은 내 하루를 구했습니다.
스티븐 쑤

무엇을 -vvv의미 git fetch -vvv합니까? 나는 그것에 대해 어떤 정보를 찾을 수 coundn't 문서 자식을 페치
구오

@guo의 verbosity또는 debug로깅 수준입니다 git. fetch방법 이 아닙니다 .
marlo jul

1
@ kawing-chiu 이것은 당신이 너무 많은 브랜치를 가지고 있고 이전에 '인터넷 연결'을 위해 크기가 크면 유용하며 지금은 모든 브랜치를 얻을 여유가 있습니다. :)
marlo

62

@jthill의 응답과 주석을 읽은 후 가장 잘 작동 한 것은 명령 set-branches에 대한 옵션 을 사용하는 것입니다 git remote.

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

이렇게하면 명명 된 원격지에서 추적하는 분기 목록이 변경되어 필요한 분기 만 가져오고 체크 아웃 할 수 있습니다.


15
git remote set-branches --add origin 'remote_branch_name'.git / config 파일에서 가져올 원격 브랜치 (또는 브랜치 패턴) 목록에서 새 브랜치를 기존 브랜치에 추가하는 것보다 사용하는 것이 더 나을 수 있습니다 .
dumbledad

2
OMG, 작은 따옴표 '가 중요합니다git remote set-branches --add origin 'remote_branch_name'
Weekend

@Weekend 내가 작은 따옴표를 제외 할 때까지이 작업을 할 수 없었습니다
PandaWood

@PandaWood 당신은 아마 Windows에있을 것입니다. 대답의 "$"기호는 Bash (Unix 또는 Cygwin / MSYS)를 의미합니다.
Yongwei Wu

문서 에서 작은 따옴표가 필요하다는 것을 알지 못하며 적어도 macOS에서는 하나가 없어도 잘 작동하는 것 같습니다.
Nickolay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.