마스터 이외의 것을 가리 키도록 Git 원격 HEAD 변경


124

"마스터"이외의 것을 가리 키도록 Git 리모트의 HEAD 참조를 어떻게 설정합니까?

내 프로젝트에는 "마스터"분기를 사용하지 않는 정책이 있습니다 (모든 분기에는 의미있는 이름이 있어야 함). 또한 표준 마스터 리포지토리는 ssh : //를 통해서만 액세스 할 수 있으며 셸 액세스는 없습니다 (예 : GitHub 또는 Unfuddle).

내 문제는 원격 저장소에 여전히 refs / heads / master에 대한 HEAD 참조가 있지만 다른 분기를 가리켜 야한다는 것입니다. 이로 인해 두 가지 문제가 발생합니다.

  1. 저장소를 복제 할 때 여기에

    경고 : 원격 HEAD는 존재하지 않는 참조를 참조하므로 체크 아웃 할 수 없습니다.

    혼란스럽고 불편합니다.

  2. 웹 기반 코드 브라우저는 트리 탐색을위한 기반으로 HEAD에 의존합니다. 유효한 분기를 가리 키려면 HEAD가 필요합니다.


기록을 위해 하나의 가능성을 추가했지만 귀하의 경우에는 적합하지 않습니다.
VonC

"공통 조상이없는"트릭 : 흥미 롭습니다. 자세한 답변으로 게시하고 작동하는 경우 공식 답변으로 선택할 수 있습니다.
VonC

12
FWIW, 질문에서 GitHub를 언급 했으므로 GitHub에서 HEAD 참조를 변경하려면 리포지토리의 "관리"화면으로 이동하여 "기본 분기"드롭 다운을 HEAD가 가리키고 싶은 분기로 변경하십시오.
Joe


답변:


63

1 년 전에 GitHub 에서 거의 같은 질문 이있었습니다 .

아이디어는 마스터 브랜치의 이름을 바꾸는 것이 었습니다.

git branch -m master development
git branch -m published master
git push -f origin master 

마스터 만들기는 사람들이 사용하기를 원하는 것을 가지고 있으며 다른 모든 작업을 지점에서 수행합니다.

( " git-symbolic-ref HEAD refs/head/published"은 원격 저장소로 전파되지 않습니다.)

이것은 " Git에서 origin / master를 어떻게 삭제합니까? "와 유사합니다 .


이 스레드 에서 말했듯 : (강조 내)

" git clone"는 단일 로컬 분기 만 만듭니다.
이를 위해 HEAD ref원격 저장소의를보고 참조하는 원격 분기와 동일한 이름의 로컬 분기를 만듭니다.

이를 마무리하기 위해 repo A가 있고 복제합니다.

  • HEAD참조 refs/heads/master및 존재
    -> 원점 / 마스터에서 시작하여 master라는 로컬 분기를 얻습니다.

  • HEAD 참조 refs/heads/anotherBranch그 존재는
    -> 당신은라는 로컬 브랜치를 얻을 anotherBranch부터,origin/anotherBranch

  • HEAD 참조 refs/heads/master및 존재하지 않음
    -> "git clone"이 불평 함

HEADrepo 에서 ref 를 직접 수정하는 방법이 있는지 확실하지 않습니다 .

(당신의 질문의 모든 요점입니다, 나는 압니다;))


아마도 유일한 방법은 "빈민을위한 출판물" 일 것입니다.

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

그러나 그것은 서버에 대한 쓰기 액세스를 포함하며 항상 가능한 것은 아닙니다.


" Git : Bare 저장소에서 Active Branch를 변경하는 올바른 방법? " 에서 설명했듯이 git remote set-head원격 저장소에서 아무것도 변경하지 않습니다.

로컬 저장소에 로컬로 저장된 원격 추적 분기 만 remotes/<name>/HEAD.


감사합니다, VonC. 여기에 게시하기 전에 읽었습니다. 그러나 보시다시피 "마스터"라는 지점은 기술 및 정책상의 이유로이 프로젝트에서 환영받지 못합니다.
JasonSmith

그런 다음 사전 커밋 후크를 통해 마스터 분기에 대한 업데이트를 허용하지 않음으로써 해당 정책을 시행 할 수 있습니다.
VonC

네, 제가 원하는 것을 할 수있는 방법이 없다는 것이 밝혀지면 정확히 그렇게하고 당신의 대답을 받아 들일 것입니다. 팔로우 해 주셔서 감사합니다!
JasonSmith

업데이트 해주셔서 감사합니다. 지금은 커밋이 하나 뿐인 마스터 브랜치를 만들기 위해 "no-common-ancestor"트릭을 사용했습니다. (즉 : git branch -D master; echo ref : refs / heads / master> .git / HEAD; rm *). 그런 다음 GO_AWAY라는 파일을 만졌고 커밋 메시지가 상황을 설명합니다. 지금은 작동합니다. 소스를 통해 확인하고 수신 측이 최종 답변을 위해 HEAD를 설정하는 위치를 추적 할 수 있습니다.
JasonSmith

1
@ctn 단순히 -f( --force) 옵션을 잊었 기 때문 입니다. 그에 따라 답변을 편집했습니다. 그런 다음 참조가 동일한 옵션을 사용한다고 대답하십시오.
VonC

42

업데이트 : 이것은 저장소 ( "클라이언트")의 로컬 복사본에 대해서만 작동합니다. 아래 다른 사람들의 의견을 참조하십시오.

최신 버전의 git (2014 년 2 월)에서 올바른 절차는 다음과 같습니다.

git remote set-head $REMOTE_NAME $BRANCH

예를 들어 원격의 헤드 origin를 분기로 전환하면 develop다음과 같습니다.

git remote set-head origin develop


이 기능은 서버에 최신 버전의 git이 필요합니까 아니면 클라이언트 시스템에 최신 git이 설치되어 있으면 충분합니까?
Mikko Rantalainen 2014 년

3
@Totor는 간결하지만 맞습니다. 이 답변은 반대표를 받아야합니다. Git은 "원격에 대한 로컬 기본 분기"라는 다소 혼란스러운 개념을 가지고 있습니다. "origin / defaultbranch"대신에 "origin"을 입력 할 수 있으며 순수한 클라이언트 측 작업입니다. 긴 이야기 : git-scm.com/docs/git-remote # set-head

1
@MarchH가 말하는 내용을 확인하려면 run git checkout -b default; git push origin HEAD; git remote set-head origin default. 그런 다음로 로컬 변경 사항을 검사 할 수 있습니다 cat .git/refs/remotes/origin/HEAD(이어야 함 ref: refs/remotes/origin/default) 및 원격 변경 git remote show origin이 없는지 여부 (기본 브랜치를 추가하기 전에 그대로 유지됨).
De Novo

37

GitHub에 대해 언급 했으므로 사이트에서 수행하려면 프로젝트로 이동하십시오.

admin > Default Branch > (choose something)

끝난.


1
우수한! 그것은 마지막 빠진 부분이었습니다.
berkus

내 원점 / HEAD는 이미 마스터가 아닌 기능 분기를 가리 킵니다. "메인 브랜치"를 앞뒤로 변경해 보았지만 HEAD에 영향을주지 않았습니다. 제안 사항이 있습니까?
Daniil Shevelev

3
설정> 지점> 기본 지점
춘 양

12

보다: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

이것은 git 저장소의 기본 브랜치를 설정합니다. 베어 또는 미러링 된 저장소에서 실행할 수 있습니다.

용법:

$ git symbolic-ref HEAD refs/heads/<branch name>

6
$ 자식 상징적-REF HEAD의 심판 / 헤드 / 이름의 분기
라미

원격 저장소에서이 작업을 수행했으며 어떤 이유로 헤드가 다른 브랜치 이름 인 복제 문제를 해결 했으므로 마스터를 복제하려고 시도하는 동안 작성기에서 마스터를 닫으려고 할 때 오류가 발생했습니다. 이것은이 시나리오에 매우 구체적 일 수 있습니다. 하지만, 다른 사람은 그 자리에있을 수 있으며 무엇을 궁금해
크리스토퍼 토마스

10

(기본적으로 " 원격 저장소에 git symbolic ref 생성 "이라는 질문이 이미 있었지만 보편적 인 답변을받지 못했습니다.)

그러나 다양한 git "farms"에 대한 구체적인 답변이 있습니다 (여러 사용자가 제한된 인터페이스를 통해 git repos를 관리 할 수 ​​있음 : http 및 ssh를 통해) : http://Github.com , http://Gitorious.org , http : / /repo.or.cz , Girar ( http://git.altlinux.org ).

이러한 특정 답변은이 페이지를 읽고 이러한 특정 서비스에 대해 생각하는 사람들에게 유용 할 수 있습니다.


4
이제 repo.or.cz (예 : repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git ) 및 gitorious.org 에서 HEAD 분기를 선택할 수있는 드롭 다운 메뉴가 있습니다 . , 너무. 큰!
imz-Ivan Zakharyaschev

7

쉘에서 원격 저장소에 액세스 할 수있는 경우 .git (또는 베어 저장소 인 경우 기본 디렉토리)로 이동하여 올바른 헤드를 가리 키도록 HEAD 파일을 변경하십시오. 예를 들어, 기본적으로 항상 'refs : refs / heads / master'를 포함하지만, 대신 foo가 HEAD 여야하는 경우 HEAD 파일을 편집하고 내용을 'refs : refs / heads / foo'로 변경하십시오.


나는 Git 서버에 대한 관리자 권한이 있으며 정확히 똑같이했습니다. 우리는 Gitolite를 사용하고 내가 만든 저장소로 갔다. 디렉토리 이름은 myrepo.git입니다. 주어진 디렉토리에 HEAD 파일의 내용이 변경되었습니다 ref: refs/heads/masterref: refs/heads/mainline. 이제 로컬 상자에서 저장소를 복제하려고 할 때 여전히 마스터를 가리 킵니다. 나는 git clone ssh://gitolite@git.server/myrepo명령을 내렸다 . 그러한 행동에 대한 아이디어가 있습니까?
Technext

망할 놈의 서버 버전 : git version 1.7.1& 힘내 클라이언트 버전 :git version 1.9.4.msysgit.2
Technext

5

porcelain Git 명령 만 사용하여 분리 된 마스터 브랜치를 생성 할 수 있습니다 .

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

그것은 우리에게 무례한 메시지를 가진 마스터 브랜치를 제공 합니다 (더 예의 바르기를 원할 수 있습니다). 이제 우리는 "실제"브랜치를 만들고 ( SVN을 기리기 위해 트렁크 라고합시다 ) master 와 이혼합니다 .

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

이봐, 프레스토! gitk --all마스터트렁크 사이에 링크없이 표시 됩니다.

여기서 "마법"은 --amendgit commit 이 현재 HEAD와 동일한 부모로 새 커밋을 생성 한 다음 HEAD가이를 가리 키도록한다는 것입니다. 그러나 현재 HEAD에는 저장소의 초기 커밋이므로 부모가 없으므로 새 HEAD도 하나를 얻지 못하여 서로 분리됩니다.

refs / heads / master가 여전히 가리 키기 때문에 이전 HEAD 커밋은 git-gc에 의해 삭제되지 않습니다 .

--allow-빈 우리가 빈 트리를 투입하고 있기 때문에 플래그는 필요하다. 몇 가지가 있다면 자식 추가 애프터의 자식 RM 다음은 필요하지 않을 것입니다.

실제로 저장소에서 초기 커밋을 분기하고, 트리를 삭제하고, 분리 된 트리를 추가 한 다음 git commit --amend 를 수행하여 언제든지 분리 된 분기를 만들 수 있습니다 .

나는 이것이 원격 저장소에서 기본 브랜치를 수정하는 방법에 대한 질문에 대한 대답이 아니라는 것을 알고 있지만 분리 된 브랜치를 만드는 방법에 대한 명확한 답변을 제공합니다.


1
다른 리포지토리에서 관련되지 않은 브랜치를 가져와 이름을 지정하여 분리 된 브랜치를 더 쉽게 만들 수 있습니다. 예 를 들어은 remote 의 분기와 일치하는 git fetch git:user@example.com:foo remote-branch-name && git checkout -b detached-branch FETCH_HEAD새 분기 detached-branch를 추가 합니다. 물론 "원격"은 이전에 준비한 로컬 파일 시스템의 저장소가 될 수 있습니다. remote-branch-namegit:user@example.com:foo
Mikko Rantalainen 2013 년

2

먼저 기본값으로 설정할 새 분기를 만듭니다. 예를 들면 다음과 같습니다.

$>git branch main

다음으로 해당 분기를 원점으로 푸시합니다 .

$>git push origin main

이제 GitHub 계정에 로그인 할 때 저장소로 이동하여 설정> 기본 분기를 선택하고 " 기본 "을 선택할 수 있습니다 .

그런 다음 원하는 경우 마스터 브랜치를 삭제할 수 있습니다.

$>git push origin :master


이해해야 할 요점은 호스팅 공급자 (이 예에서는 GitHub)가 기본 브랜치를 수정하는 방법을 제공하지 않으면 운이 없다는 것입니다. Git 프로토콜은 원격 기본 브랜치를 수정하는 기능을 제공하지 않습니다. git symbolic-ref원격 쉘 에서 실행 하거나 HEAD원격 저장소 루트 디렉토리에서 호출 된 텍스트 파일을 수정할 수 있어야합니다 .
Mikko Rantalainen 2013 년

2

질문과 관련하여 검색 할 때 여기에 도달했습니다.

GitHub에서 변경된 기본 브랜치를 인식하는 로컬 저장소를 만드는 방법

완전성을 위해 답을 추가하십시오.

git remote set-head origin -a

0

gitolite 사람들을 위해 gitolite는-wait for it-이라는 명령을 지원합니다 symbolic-ref. 저장소에 대한 W (쓰기) 권한이있는 경우 해당 명령을 원격으로 실행할 수 있습니다.


-1

간단한 그냥 GitHub의 계정에 로그인하고 탐색 메뉴에서 맨 오른쪽에 선택 설정을 에서, 설정 탭을 선택 기본 지점을 나를 위해 속임수를 썼는지 저장소의 메인 페이지로 다시 돌아갑니다.


1
GitHub 인터페이스에서 새 분기를 기본값으로 표시하지만 git clone [repo]를 수행 할 때 해당 분기를 얻지 못합니다. 즉 .git / HEAD에 잘못된 참조가 있습니다.
Joseph Sheedy 2013-02-14
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.