2010-06-14 7 views
13

맨손으로 원격 저장소에서 복제 된 로컬 저장소가 있습니다. 다음 명령은 원격 저장소의 분기를 나열합니다.git에서 원격 저장소의 원격 지점을 체크 아웃하려면 어떻게해야합니까?

$ git ls-remote <remote> 

74bd3eb190edb39db04f6c0c4dbbb9e1e96bc6db refs/remotes/test 
85de54d6ae813c624b9623983e6b0a4948dae0fe refs/remotes/trunk 

나는 체크 아웃하고 원격의 원격 지사 트렁크을 추적 할. 어떻게해야합니까?

이것은 원격 저장소의 로컬 분기를 체크 아웃하는 것과 다릅니다. 이것은 원격 저장소가 어떻게 보이는지입니다.

$ git branch -a 

master 
remotes/test 
remotes/trunk 

자식 원격 저장소의 브랜치의 모든 가져 오기 위해 원격> <를 가져 실행 한 후, 나는 로컬 저장소에서이 출력을 얻을. 질문

$ git branch -r 

repo/HEAD -> repo/master 
repo/master 
+1

Jefromi와 Chris의 답변으로 충분합니다. 난 그냥 재미있는 질문에 대한 참조를 추가 http://stackoverflow.com/questions/1070496/having-a-hard-time-understanding-git-fetch. – VonC

답변

11

원격에서 임의의 심판을 가져올 수 있습니다 (서버가 기꺼이 제공하려는 경우). refs/heads/ 외부의 참조를 페치하는 핵심은 refs/으로 시작하는 전체 참조 경로를 제공하는 것입니다. 원하는 경우 리모컨으로 구성되지 않은 저장소에서 가져올 수도 있습니다 (자식이 가져 오기은 원격 이름 대신 URL을 사용할 수 있음).

기본적으로 구성된 원격지는 원격 저장소의 refs/heads/ 네임 스페이스에서만 가져 오기하므로 refs/remotes/ 안에있는 모든 항목을 가져 오지 않습니다. 그러나 refs/remotes/trunk과 같은 완전한 참조를 사용하여 내부의 참조를 참조 할 수 있습니다 (remotes/trunk도 작동 할 수 있지만 모호 할 수도 있음).

가져온 refspec에서 대상 ref를 지정하지 않으면 특수한 FETCH_HEAD ref에 저장됩니다.


가져 오기 저장소의 refs/remote/trunk FETCH_HEAD에와 분리 된 HEAD로 체크 아웃 :

git fetch remote-name-or-url refs/remotes/trunk && 
git checkout -b trunk-from-remote FETCH_HEAD 
: 대신 분리 된 HEAD를 사용하는 명명 된 지역의 지점을

git fetch remote-name-or-url refs/remotes/trunk && 
git checkout FETCH_HEAD 

동일하지만, 만들

동일하지만 로컬 지점에 직접 입력 :

git fetch remote-name-or-url refs/remotes/trunk:trunk-from-remote && 
git checkout trunk-from-remote 

구성된 리모컨으로 작업하는 경우 해당 remote.<remote-name>.fetch 구성을 다시 쓰고 refs/heads/refs/remotes/의 가져 오기를 자동화하는 추가 항목을 추가 할 수 있습니다.

# fetch branchs of remote into remote-name/heads/* 
git config remote.remote-name.fetch '+refs/heads/*:refs/remotes/remote-name/heads/*' && 
# fetch remotes of remote into remote-name/remotes/* 
git config --add remote.remote-name.fetch '+refs/remotes/*:refs/remotes/remote-name/remotes/*' 

가능한 충돌을 피하기 위해, 상기 예는 분리 된 네임 ( …/heads/…/remotes/)에 저장 심판을 페치 구성한다. 원하는 경우 다른 이름을 선택할 수 있습니다. 충돌이 없다고 확신하는 경우 직접 refs/remotes/remote-name/ 아래에 둘 다 채울 수도 있습니다.

+0

리모트 원격 브랜치를 자동으로 추적 로컬 브랜치로 끌어 오도록 설정할 수 있습니까? 아니면 리모컨에 자체 로컬 추적 지점이 있는지 확인하는 것이 좋습니다. 그러면 로컬로 추적 할 수 있습니까? –

+0

@ 한스 : 답변을 다시 작성했습니다. 필자는 그다지 중요하지 않은 "구성 해제 된 원격"측면을 강조하고 끝에 자동화 작업에 대해 조금 추가했습니다. –

+0

원격 브랜치 중 하나를 추적하기 위해 로컬 브랜치를 설정하려면 어떻게해야합니까? 나는 'git checkout -b trunk --track repo/remotes/trunk'를 수행하지만, 'git pull repo'는 branch.trunk.merge config를 이해하지 못한다. 나는 'git pull repo/remotes/trunk : refs/remotes/repo/remotes/trunk'명령을 실행해야한다. –

-1

git.exe checkout --track -b trunk refs/remotes/trunk

+0

여기서 문제는 원격 브랜치가 원격 브랜치를 추적하는 로컬 브랜치를 가지고 있지 않다는 것입니다. –

+0

"리모트 저장소에는 없다"라는 철자가 있습니다 ... –

6

좋은! 나는 이것이 효과가 있다는 것을 압니다. 내 머리의 상단을하지 아무것도 생각할 수 없다 :

git fetch origin refs/remotes/trunk 
git checkout FETCH_HEAD 
# or make a branch to check out 
git checkout -b remote-trunk FETCH_HEAD 

그 원격 심판은 어쩌면 내가 이름이 오해 ... 형태 refs/remotes/<remote-name>/<branch-name> 아닌 것을 그것은, 그런데, 이상한, 그러나이 방법은 효과가있다.

3

실제로이 문제에 대한 만족스러운 해결책을 발견했습니다. 리모컨을 추가하면 로컬 헤드를 가져 와서 당길 수있는 refspec이 설정됩니다. 나는 리모콘의 원격 참조를 가져 오는/repo-remotes /라는 다른 리모컨을 설정합니다. .git/config 파일은 다음과 같이 끝납니다.

[remote "repo"] 
    url = ssh://[email protected]<hostname>:<port>/repo 
    fetch = +refs/heads/*:refs/remotes/repo/* 

[remote "repo-remotes"] 
    url = ssh://[email protected]<hostname>:<port>/repo 
    fetch = +refs/remotes/*:refs/remotes/repo-remotes/* 

이렇게 할 수 있습니다. 원격 저장소의 원격 지사/트렁크/추적 로컬 지점을 설정

$ git fetch repo-remotes 
$ git checkout -b remote-trunk --track remotes/repo-remotes/trunk 

.

+0

두 번째 리모컨이 필요 없으며 여분의 패치 구성을 추가하기 만하면됩니다. –

관련 문제