힘내 : 베어 저장소에서 Active Branch를 변경하는 올바른 방법은 무엇입니까?


195

내 프로젝트의 중앙 저장소로 사용되는 기본 저장소가 있습니다. 모든 개발자가 git clone <repo>공유합니다. 그들은 복제 작업을 수행 할 때 (그들이하지 않는 한, 그들은 마스터 분기의 체크 아웃을 얻을 git clone -n) 때문에 repo.git/HEAD포함 ref: refs/heads/master이 제작, 활성 지점 .

문제는 활성 지점을 올바르게 변경하는 방법입니다 . repo.git/HEAD파일을 직접 해킹 할 수는 있지만 불쾌하고 해키처럼 보입니다.

git checkout <otherbranch>repo .git디렉토리 에서 시도했지만 작업 트리에 없기 때문에 실패했습니다.

나는 시도 git update-ref HEAD refs/heads/otherbranch했지만 refs / heads / master를 refs / heads / otherbranch와 동일하게 업데이트했다.

나는 노력 git update-ref --no-deref HEAD refs/heads/otherbranch했고 거의 효과가있었습니다. HEAD파일을 업데이트 했지만에 의해 지정된 커밋의 SHA1로 설정되었습니다 refs/heads/otherbranch.

git version 테스트하고 1.7.0.2.msysgit.0있습니다.

나는이를 통해 작업을 수행 할 수있는 방법이 없습니다 추측하고있어 git push(!) 기본 지점이 조금 안전하지 않은 것 같습니다 변경하는 모든 잡다한를 허용하는 등,하지만 확실히 환매 특약에서 그것을 할 수있는 더 좋은 방법이 .git직접 해킹보다 디렉토리 HEAD파일.


IMO 당신은 근본적으로 잘못된 일을하려고합니다. 기본 브랜치를 마스터 이외의 다른 것이되도록하려면 해당 브랜치가 마스터 여야합니다. 또는 두 개의 다른 저장소를 사용하십시오.
니콜라스 기사

12
이것이 어떻게 근본적으로 잘못된 일을하려고합니까? 베어 리포지토리는 여러 분기를 지원합니다. 베어 리포지토리를 로컬 리포지토리에 백업으로 사용하여 브랜치를 미러링합니다. 둘 다에 마스터가 있고 둘 다에 개발 지점이 있습니다. 베어 리포지토리에서 개발 지점의 로그를 보려면 파일을 해킹해야합니다. 베어 리포지토리 지원과 관련하여 git이 근본적으로 잘못된 것처럼 보입니다.
Cthutu

15
@NicholasKnight IMHO 당신은 근본적으로 잘못되었습니다. "master"에 대해 브랜치 이름으로 특별한 것은 없으며 단지 기본값입니다. "마스터"는 회사에 의미가 없으므로 유지 관리하는 리포지토리에는 마스터 지점이 없습니다. 릴리스를 수행 할 때마다 새 릴리스 번호로 새 유지 보수 브랜치를 작성하고이를 활성 브랜치로 지정하십시오.
Spacemoose

난 당신이에서오고있어 어디에 감사 드리며 @NicholasKnight, 이것은의 방법으로 전환하는 얘기하는 최초의 SO Q / A입니다 마스터! 베어 클론을 만들 때 기능 브랜치에 초기 리포지토리가 있었고 해당 베어 리포지토리의 후속 복제본이 마스터 대신 해당 분기로 기본 설정되었습니다.
Warbo

1
와우-이 질문은 그냥 실행되고 실행됩니다-그것은 1 위의 평판 포인트 득점자입니다! "마스터"에 관한 것은 단지 이름 일뿐입니다. 조직, 팀, 프로젝트, 단계 등 어떤 것이 든 이해가되지 않는다면 협력자가 레포를 복제 할 때 즉시 전환 할 수 있도록 적절한 것을 선택하십시오 Configuration Manager로서 원하는 지점으로 연결하십시오. 나는 ClearCase (블리치!)로 작업 했었으므로 선택은 "main", "main"또는 "main"입니다. 수다.
kbro

답변:


280

원격 베어 저장소에 액세스 할 수있는 경우이 기사는 다음을 제안합니다 .

git symbolic-ref HEAD refs/heads/mybranch

다음을 포함하도록 저장소의 HEAD 파일을 업데이트합니다.

ref: refs/heads/mybranch

에 기록 된대로 git-symbolic-ref


원격 저장소에 액세스 할 수 없으면 이전 답변을 참조하십시오 .


다음과 같은 명령을 기억하십시오 git remote set-head:

  • 원격 저장소 의 기본 분기는 변경하지 않습니다 . 로컬 리포지토리에 저장된 원격 추적 지점
    만 다음과 같이 변경합니다.refs/remotes/<name>/HEAD

  • HEAD자체적으로 변경되지 않으므로 (다시 만 refs/remotes/<name>/HEAD) 따라서 git symbolic-ref.

그래서 git remote set-head 하지 않습니다 여기에 대한 대답.
git symbolic-ref HEAD원격 저장소에 직접 액세스 할 수있는 경우입니다.


3
감사! 원격 베어 저장소에 직접 액세스 할 수 있으므로 git-symbolic-ref가 작업을 수행합니다. 나는 다른 스레드에서 언급 된 공통 조상이 아닌 트릭을 좋아합니다. 나는 이것을 인터넷 검색에 사용했지만 이전 답변을 찾을 수 없었지만 "git remote head master"는 git-remote (1) 바로 아래에서 두 번째로 높은 순위를 기록했습니다. 기괴한. 찾고자하는 것을 정확히 모를 때 무언가를 찾는 것이 얼마나 어려운지 보여 주기만하면됩니다.
kbro

git symbolic-ref HEAD refs/heads/mybranch나를 위해 잘 작동했습니다! 감사! ;)
vinzenzweber

1
실수로 마스터와 다른 지점을 체크 아웃했기 때문에이 질문에 정말 감사드립니다. 이제 고쳐야했습니다.
Jonny Best

이것은 나를 위해 작동하지 않습니다. 이상하게도 베어 리포지토리의 원격 HEAD에 올바른 분기가 표시되지만 git STILL은 복제 할 때 다른 분기로 기본 설정합니다!
Magnus

@Magnus는 새 페이지에서 물어 보는 것이 좋습니다.
VonC

3

지점을 변경하려면 사용하려는 지점에 대한 HEAD 참조를 변경해야합니다.

먼저 베어 저장소의 모든 참조를 수행하여 나열하십시오.

$find ref

그런 다음 지점에 대한 참조를 찾으십시오. 형식은 다음과 같습니다 refs/heads/<my_branch>. 다음 단계는 현재 참조를 확인하는 것입니다.

$git symbolic-ref HEAD

따라서 현재 분기가 어느 것인지 알고 필요에 따라 업데이트하십시오.

$git sumbolic-ref HEAD ref/heads/<my_branch>

감사합니다. 즐겨.


2

활성 지점을 올바르게 변경하는 방법은 무엇입니까?

  • 상태 : repo .git 디렉토리의 git checkout이 치명적을 리턴합니다.이 조작은 작업 트리에서 실행되어야합니다.

  • 팁 : --work-tree 인수를 추가하십시오.

자세한 예 : 가정 : 원격 서버의 베어 git :

~ / bare_git_repository.git 분리 된 작업 트리 : / var / www / myappremote

로컬 서버에서 : 브랜치 버전을 만듭니다 .1.7 (우리의 다른 브랜치)

자식 분기 버전 1.7

자식 푸시 원점 버전 1.7

git bare repo가있는 원격 서버에서 :

$ cd ~ / bare_git_repository.git

$ 자식 분기

  • 마스터
    버전 .1.7

언급 한대로 다음 명령

자식 체크 아웃 버전 1.7

반환

치명적 :이 작업은 작업 트리에서 실행해야합니다.

다음 명령 사용

git --work-tree = / var / www / myappremote 결제 버전 1.7

성공적으로 활성 지점을 변경

$ 자식 분기

석사

  • 버전 .1.7

다음과 같이 결과를 확인하십시오

ll / var / www / myappremote

그것이 도움이되기를 바랍니다.


이 매우 간단한 솔루션은 저에게 효과적이었습니다. 감사합니다! 참고 사항 : 명령을 성공적으로 실행하려면 손으로 빈 작업 트리 디렉토리를 만들어야했습니다.
Joël Esponde

-1

또한 베어 저장소에 액세스 할 수없는 경우 a를 수행하여 git remote set-head완료

이 이전 답변보기


-3

또한 서버에 베어 리포지토리를 사용하여 파일을 성공적으로 검색 할 수있었습니다.

git clone //server/repo/directory -b branch_name

맨 페이지에 비 베어 리포지토리에만 해당한다고하더라도 새 로컬 리포지토리에 추가 할 수 있습니다.


1
당신이 말하는 것은 사실이지만, 특정 분기를 선택하기 위해 -b를 사용한다는 사실은 내 질문의 맥락에서 답을 깨뜨립니다. 이는 DEFAULT 분기를 어떻게 설정합니까?
kbro December

-4

적용 전후에 두 디렉토리를 비교했습니다.

git symbolic-ref HEAD refs/heads/mybranch

repo.git / HEAD 파일 만 변경되었으므로 파일을 "해킹"하는 것만으로도 안전합니다.


2
Git 참조 파일을 직접 편집하면 발생할 수있는 미묘한 문제가 있습니다. 나는 그것을 반대하는 것이 좋습니다. 배관 명령은 심판을 직접 편집하는 것보다 쉽고 안전합니다.
Alain O'Dea

2
이 @boryn의 장점은 무엇입니까?
Alex Chamberlain

2
힘내는 심판의 역사와 같은 백그라운드에서 많은 것들을 추적합니다. 파일을 수동으로 변경하면 기록되지 않습니다. 아마 중요하지 않을 것입니다. 그러나 커밋을 추적하지 않고 찾아 내려면 파일을 "해킹"하지 않은 경우 더 행복해집니다.
qwerty9967

나는 명령을 사용했다. 그러나이 답변은 작동 방식을 이해하는 데 도움이되었으며, 부분적으로 Refs / Heads는 내부적 인 것으로 이해해야하며 "경로"의 마지막 부분 만 변경해서는 안됩니다. 그래서 나는 그것이 중요한 정보라고 생각하기 때문에 투표했습니다.
Mike Keskinov 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.