“master”가 아닌 기본 브랜치 이름으로 Git 저장소를 생성하려면 어떻게해야합니까? 특별한 의미가없는 것처럼 “origin”도 마찬가지입니다.

에서 프로 망할 놈의 책 , 그것은 말한다

“원산지”는 특별하지 않습니다

브랜치 이름 “master”가 Git에서 특별한 의미가없는 것처럼 “origin”도 마찬가지입니다. “master”는 널리 사용되는 유일한 이유 인 git init를 실행할 때 시작 브랜치의 기본 이름 인 반면 , “origin”은 git clone을 실행할 때 원격의 기본 이름입니다. 대신 git clone -o booyah를 실행하면 booyah / master가 기본 원격 분기로 사용됩니다.

즉, 기본 브랜치 이름을 main 또는 main-branch 또는 이와 유사한 이름으로 사용할 수 있습니다 . 다른 기본 브랜치 이름으로 man git-init초기화 하는 옵션이 표시되지 않았습니다 repo.

GitHub는 설정 페이지에서 기본 브랜치 이름을 설정하는 방법을 보여줍니다 . 그러나 특정 Git 호스팅 사이트 에서 설정하는 방법에 대해 말하는 것이 아닙니다 . 나는 특정 Git 호스팅 사이트 에 관한 것이 아니라 Git에 대해서만 엄격하게 요구하고 있습니다 .

그렇게하는 방법이 있습니까?



답변

새로운 Git, 새로운 Repo

git 버전 2.28.0부터 git init명령은 이제 --initial-branch(또는 -b짧게) 매개 변수를 사용합니다. 이 두 명령은 “trunk”라는 브랜치가있는 새 Git 저장소를 생성하며, 항상 “master”(무엇의 마스터?)보다 나에게 더 의미가 있습니다.

git init --initial-branch=trunk
git init -b trunk

이것은 init.defaultBranch설정 으로 구성 할 수 있습니다. 모든 새 저장소가 기본 분기로 “트렁크”를 갖도록하려면 다음을 수행하십시오.

git config --global init.defaultBranch trunk

이전 Git, 새 저장소

일부 시스템에는 여전히 오래된 Git 설치가 있습니다. 내 Debian 10 서버 ( 2020 년 10 월 현재 안정 버전 인 Busster)에는 -b옵션을 지원하지 않는 Git 2.20이 포함되어 있습니다. 한 가지 옵션은 저장소를 생성 한 다음 브랜치 이름을 변경하는 것입니다. 이 기술은 일반 (베어가 아닌) 저장소에서 작동합니다.

git init
git checkout -b trunk

trunk대신 현재 분기로 새 저장소를 만듭니다 master. 브랜치 master는 실제로 존재하지 않습니다 . 브랜치 는 적어도 하나의 커밋을 가질 때까지 생성되지 않습니다. 브랜치가 생성 될 때까지 브랜치는에만 존재 .git/HEAD하므로으로 master전환 할 때 브랜치가 사라지는 이유를 설명합니다 trunk.

베어 레포

베어 리포지토리의 경우 실행할 수 없습니다 git checkout(바로 베어라는 의미입니다). 대신 HEAD를 다른 분기를 가리 키도록 변경할 수 있습니다.

git init --bare
git symbolic-ref HEAD refs/heads/trunk

오래된 저장소

이미 커밋 한 경우 git branch -m대신 실행할 수 있습니다 .

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

이렇게하면 브랜치 가 생성되면 에서 master로 이름이 바뀝니다 trunk.

저장소가 비어 있는지 여부에 따라 메커니즘이 다르기 때문에 약간 어색해 보이지만 작동합니다. “새 브랜치 생성 및 삭제 master” 로 접근 할 수도 있습니다 .


답변

간접적으로 git init다른 기본 브랜치를 사용 하도록 구성 할 수 있습니다 . 현재 브랜치는에 의해 정의되며 HEAD, 이는 Git에게 현재 참조가 무엇인지 알려주는 텍스트 파일입니다.

사용 init.templateDir물어, 수 git init다른 하나를 사용 :

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

그리고에서 ~/.config/git/template/HEAD한 줄 (+ 줄 바꿈) : ref: refs/heads/main(기본값은 branch main).

저장소를 만들 때 의 전체 내용이 디렉토리에 templateDir복사됩니다 .git. 기본값 (여기 /usr/share/git-core/templates)에는 일부 샘플 후크 및 기타 파일이 포함되어 있지만, 예를 들어 새 템플릿 디렉토리를 사용하여 기본 후크를 설정할 수 있습니다.

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files


답변

master” 이외의 기본 브랜치 이름으로 Git 저장소를 생성하려면 어떻게 해야합니까?

Git 2.28 (2020 년 3 분기)을 사용합니다. 기존 리포지토리의 기본 브랜치 이름과 새로 생성 된 리포지토리의 첫 번째 브랜치에 사용되는 기본 이름이 구성 가능해 지므로 결국 하드 코딩 된 ‘에서 벗어날 수 있습니다. master‘.

그리고 2020 년 8 월 GitHub의 알림 :

당신은 사용자, 조직 또는 기업을위한 새로운 저장소에 대한 기본 분기를 변경하지 않은 경우 2020년 10월 1일에서 자동으로 변경됩니다 mastermain .
이 변경 사항은 언제든지 선택 해제 할 수 있습니다.

  • 사용자의 경우 https://github.com/settings/repositories 페이지에서
  • 조직 소유자의 경우 https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaults페이지에서
  • 엔터프라이즈 관리자의 경우 https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privileges페이지에서

이 변경 사항은 GitHub가 기본 브랜치의 이름을 변경하려는 프로젝트 및 관리자를 지원하기 위해 수행하는 많은 변경 사항 중 하나입니다.
변경 사항에 대한 자세한 내용은 github / renaming을 참조하십시오 .

그러나 다시 힘내 자체 (2.28, Q3 2020) 참조가 508fd8e 커밋 에 의해 (2020년 6월 29일)를 Đoàn 트란 콩 DANH ( sgn) .
참조 0068f21 커밋 , a471214 커밋 , 0cc1b47 커밋 , 32ba12d 커밋 , 6069ecc 커밋 , f0a96e8 커밋 , 4d04658 커밋 (2020 6월 24일), 및 489947c을 투입 하여 (2020년 6월 23일) 요하네스 Schindelin ( dscho) . Don Goodman-Wilson ( )의 commit 8747ebb (2020 년 6 월 24 일)를
참조하십시오 . (의해 병합 Junio C 하마노 – DEGoodmanWilson
gitstercommit 11cbda2 , 2020 년 7 월 6 일)

init: 새 저장소에 대한 초기 분기 이름을 지정할 수 있습니다.

서명자 : Johannes Schindelin

리포지토리의 메인 브랜치 이름을 변경하고자하는 프로젝트와 회사가 점점 늘어나고 있습니다 (예를 들어 이에 대한 배경은 Mislav Marohnić의 트윗 참조 ).

새 리포지토리의 브랜치 이름을 변경하려면 현재 자동으로 수행하는 유일한 방법은 Git의 모든 템플릿 디렉토리를 복사 한 다음 원하는 기본 브랜치 이름을 .git/HEAD파일에 하드 코딩 한 다음 init.templateDir복사 된 템플릿 파일을 가리 키도록 구성 하는 것입니다.

이 프로세스를 훨씬 덜 복잡하게 만들기 위해 새로운 옵션을 소개합니다 --initial-branch=<branch-name>..

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

과:

init: 구성을 통해 초기 분기 이름에 대한 기본값 설정 허용


지원자 : Johannes Schindelin 지원자 : Derrick Stolee
서명자 : Don Goodman-Wilson

방금 --initial-branch=<branch-name>하드 코딩 된 분기와 다른 초기 분기로 새 저장소를 초기화 할 수 있는 명령 줄 옵션 을 도입했습니다 .

사용자가 초기 브랜치 이름을 더 영구적으로 재정의 할 수 있도록 (즉, 각 git init호출 마다 이름을 수동으로 지정할 필요없이 ) init.defaultBranch구성 설정을 소개하겠습니다 .

참고 : merge commit 메시지에 대한 commit 489947c 는 이후 Git 2.29에서 되돌 렸습니다. ” how can I customize git ‘s merge commit message? “를 참조하십시오. 설정은 남아있다.
init.defaultBranch


이는 하위 모듈에 영향을줍니다.

submodule: remote..branch 누락에 대한 원격의 HEAD로 폴백

지원자 : Philippe Blain
서명자 : Johannes Schindelin

remote.<name>.branch구성되지 않은, git submodule update현재 분기의 이름을 사용하여 다시 폭포 master.
그러나 훨씬 더 좋은 아이디어는 remote를 사용하는 것입니다 HEAD. 합리적으로 최신 Git 버전을 실행하는 모든 Git 서버에서 symref HEAD는 메인 브랜치를 가리 킵니다.

참고 : t7419 는 원격 이 다른 분기를 가리 키 더라도 원격 분기 에 대한 하위 모듈을 업데이트 할 것으로 예상 되는 사용 사례 가 있을 수 있음을 보여줍니다 .
틀림없이이 패치는 동작을보다 직관적으로 만들지 만 모호한 설정에서 회귀를 일으킬 가능성이 약간 있습니다. git submodule update --remotemasterHEAD

그렇더라도 더 긴 전환 기간없이이 동작을 수정하는 것이 좋습니다.

  • git submodule update --remote명령은 실제로 일반적이지 않습니다.
  • 이 명령을 실행할 때 현재 Git의 동작은 원격 저장소의 현재 분기 master (이 경우 제안 된 동작이 이전 동작과 일치 하지 않는 경우) 완전히 혼란 스럽습니다 .
  • 사용자 인해 변경된 동작에 회귀가 발생하면 수정 실제로 간단하다 : 설정 submodule.<name>.branch하려면 master이전 동작을 복원합니다.

Git 2.29 (2020 년 4 분기)에서는의 테스트 contrib/fmt-merge-msg.

Emily Shaffer ( )의 commit b87528c (2020 년 8 월 3 일)를 참조하십시오 . (Merged by Junio ​​C Hamano in commit 83b8250 , 10 Aug 2020)nasamuffin
gitster

Revert "contrib: subtree: fmt-merge-msg” 에서 변경하도록 테스트 조정

서명자 : Emily Shaffer

커밋 508fd8e8baf3e18ee40b2cf0b8899188a8506d07을 되돌 립니다 .

에서 6e6029a8는 ( fmt-merge-msg우리가 ‘에 대한 병합 동작 돌아가 병합 대상이 다시 생략 할 수 있도록) master기본적으로하지 않습니다가,’ “를 포함 into 'master'병합 메시지의 끝을”. 이 테스트 수정은 더 이상 필요하지 않습니다.

또한:

Git 2.29 (2020 년 4 분기)에서는 테스트에서 ‘ master‘ 단어를 삭제하도록 업데이트 합니다.

참조 f33f2d3 커밋 , b6211b8을 커밋 (2020년 9월 26일), 및 432f5e6 커밋 , 5a0c32b 커밋 , 659288c을 투입 하여 (2020년 9월 21일) 요하네스 Schindelin ( dscho) .
(Merged by Junio ​​C gitsterHamano in commit 58138d3 , 05 Oct 2020)

tests: master브랜치 이름의 변형 방지

서명자 : Johannes Schindelin

이 용어 master는 인종적 불의를 지속적으로 상기시키는 역할을하는로드 된 역사를 가지고 있습니다. Git 프로젝트는 이것을 영속시키고 싶지 않고 이미 그것을 피하기 시작했습니다.

테스트 스위트는 기본 이름 이외의 분기에 대해이 이름의 변형을 사용합니다. 이전 커밋에서이 문제를 방금 해결 한 t3200을 제외하고 이러한 인스턴스는 테스트 스크립트 외부에서 변경이 필요하지 않기 때문에 자동화 된 방식으로 이름을 바꿀 수 있습니다.

터치 된 브랜치가 기본 브랜치와 거의 관련 topic_<number>topic-<number>없기 때문에 우리는 완전히 별개의 이름 지정 체계를 사용하기로 선택했습니다. ( t5515가 test_oid기계를 용어와 함께 사용하고 기계가 내부적으로 쉘 변수를 사용 하기 때문입니다 . 이름에 대시를 포함 할 수 없음).

이 트릭은이 (GNU) sed 호출에 의해 수행되었습니다.

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

그리고 여전히 Git 2.29를 사용합니다.

Johannes Schindelin ( )의 commit 538228e , commit a15ad5d (2020 년 10 월 8 일)를 참조하십시오 . (Merged by Junio ​​C Hamano in commit 62564ba , 08 Oct 2020)dscho
gitster

t1415: main참조 이름으로 사용하지 마십시오

서명자 : Johannes Schindelin

의 가을 – 다시 변경하는 패치 시리즈에 대비 init.defaultBranch에를 main,의는 사용하지 말자 main,이 테스트 스크립트에서 심판의 이름으로.

그렇지 않으면 해당 참조를 잡으려 는 ( man ) 도 예기치 않게 .git for-each-ref ... | grep mainrefs/heads/main

문제의 ref는 worktree-local의 것이므로 (즉, 각 워크 트리는 고유 한,처럼 HEAD) 테스트 케이스에서 이미 ” second” 라는 보조 워크 트리를 사용하므로 first대신 해당 ref에 ” ” 라는 이름을 사용하겠습니다 .

그 동안 “작업 트리”를 의미하는 “리포지토리”에 대해 말하는 테스트 제목을 조정하십시오.


답변

Git 2.28 (2020 년 7 월 27 일 출시) 이후 init.defaultBranch하드 코딩 된 용어를 대체하기 위해 새로운 구성 옵션 이 도입되었습니다 master.

기본값은 master!

사용자는 다음을 사용하여 구성 변수의 기본값을 재정의 할 수 있습니다.

$ git config --global init.defaultBranch main

자세한 내용은 git doc 장을 읽어보십시오. Init.defaultBranch 소개


답변