2013-12-07 2 views
3

로컬 자식 repo에 대한 백업 스크립트를 만들고 있습니다. 나는 가능성을 검토하고 작업을 수행하기 위해 번들을 선택했다. * master리모컨을 추가하는 자식 번들

  • git bundle create ./test.bundle --all

  • : 내가 촬영 한 단계 : 나는 다음과 같은 얻을 git branch -a로 REPO를 검사 할 때

    1. 는, 새로운 REPO 만들기 초기을 할 수는

      커밋

    지금까지으로 번들을 검사 할 때 HEAD는 1, refs/heads/master는 2 개의 참조를 얻습니다. 내가 git clone에 새 저장소로이 번들을 풀 때

    , 가지는 다음과 같다 :

    *master 
    remotes/origin/HEAD -> remotes/origin/master 
    remotes/origin/master 
    

    왜 이런 일이 무엇입니까? 거기에 원격 지점없이 첫 번째 저장소에있는 지점 만 가져올 수있는 방법이 있습니까?

    편집 : 내 질문이 좀 불분명 수 있었다

    . 달성하고자하는 바는 다음과 같습니다.

    1. 2 개의 지사, 마스터 및 테스트로 된 Repo가 있습니다. (제안 git bundle --branches으로 수행)
    2. 번들 모든 지점
    3. rm 전체의 repo
    4. 는 자식 복제와 REPO를 복원합니다. 전환시

      *master 
      remotes/origin/master 
      remotes/origin/test 
      

      : warning: remote HEAD refers to nonexistent ref, unable to checkout.

    발생하는 유일한 문제는 내가 클론 후 다음 가지를 얻을 수 있습니다 : 불행하게도 나는 그것을하지 않고 다음과 같은 오류를 얻을 수 있기 때문에 분기 매개 변수를 제공해야 테스트, 나는 새로운 지점이 만들어 졌다는 메시지를 받는다. 모든 저장소를 복제하여 원본 저장소처럼 보일 수있는 방법이 있습니까?

    *master 
    test 
    
    +0

    downvote에 대한 이유? –

    답변

    1

    번들에서 복제하면 번들의 브랜치가 복제본의 리모컨처럼 보입니다. 그건 정상입니다.

    git bundle list-heads에는 원본 저장소의 원격 참조가 표시되지만 새 복제본에는 표시되지 않습니다. 내가 예를 들어 의미 :

    $ git bundle list-heads test.bundle 
    a742ee94e8fcef80eb5619f76674bb79d7011742 refs/heads/test2 
    a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/heads/master 
    a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/HEAD 
    a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/master 
    a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/test1 
    a8bf0cf603a686ccb75179c64b3392d50ff2f4af HEAD 
    

    다음이에서 복제 :

    입니다
    $ git clone test.bundle clone2 
    $ cd clone2 
    $ git branch -a 
    * master 
        remotes/origin/HEAD -> origin/master 
        remotes/origin/master 
        remotes/origin/test2 
    

    , 그 test1 분기 원래 원격의 흔적이 없다.

    당신 이 같은 원격 참조하지 않고 번들을 만들 수 있습니다

    $ git bundle create test.bundle --branches HEAD 
    

    하지만 그게 큰 차이를 만들 것입니다 있는지 확실하지 않습니다. 나는 묶음으로 일한 적이 없기 때문에 아마이 대답을 향상시킬 수있을 것이다. 당신이 번들에서 복제 할 때

    UPDATE는

    , 번들은 새 복제의 관점에서 원격, 새로운 기원으로 볼 수 있습니다. 복제 할 때 로컬 분기가 HEAD 전용으로 작성되고 다른 분기는 원본으로 남습니다. 완전히 번들을 제거하려는 경우, 당신은 모든 원격 번들에 지사 (= 원점)에 대한 지역 지점을 만들 수 있습니다, 다음과 같이 뭔가, 리모컨을 삭제하고 번들을 삭제합니다

    for b in $(git branch -r | grep -v HEAD | cut -f2 -d/); do 
        git show-ref --verify --quiet refs/heads/$b || git checkout $b 
    done 
    

    실행하기 전에 보류 중 또는 단계별 변경이없는 깨끗한 상태인지 확인하십시오.

    +0

    하지만 번들 머리를 저장하는 머리말이 아닌가? 번들에 모든 지점을 저장하려고합니다. –

    +0

    '--branches'는 모든'refs/heads/*'를 추가 할 것이므로 모든 브랜치를 추가 할 것입니다. 그래서 그것은 당신이하고 싶은 것과 같게 들립니다. 너 해봤 어? – janos

    +0

    지금 시도 할 것입니다 –

    1

    답변을 찾을 수있었습니다. 다음은 내가 한 일입니다.

    janos가 제안 했으므로 모든 브랜치가 포함 된 번들을 만들었습니다. 결과 번들에 git clone을 만들었습니다. 이제 각 ref에 대해 지점을 체크 아웃하고 원격 지점을 제거했습니다.

    마지막으로 원격 HEAD 참조를 제거했습니다.

    나는 매우 유용이 질문에 발견 How to clone all remote branches in Git?

    +0

    내가 준 명령에서'HEAD' 매개 변수를 간과한 것 같습니다 :'git bundle create test.bundle --branches HEAD'. 거기에 당신이 당신의 업데이트에서 언급 한 경고를받지 못했기 때문입니다. 필자는 모든 원격 지점을 체크 아웃하기위한 스크립트로 내 게시물을 업데이트했습니다. upvote 및 동의 좋은 것입니다 ... – janos

    관련 문제