기본 Git 분기를 가져오는 방법?
저희 팀은 여러 repos의 기본 브랜치로 dev와 master를 번갈아 사용하고 있는데, 디렉토리에 들어갈 때 기본 브랜치를 확인하는 스크립트를 작성하려고 합니다.
이러한 저장소 중 일부에서 풀 요청이 열리면 기본적으로 'dev' 또는 'master'로 병합 대상이 됩니다.
이 정보를 설정하는 방법은 이해하지만 검색하지는 않습니다. https://help.github.com/articles/setting-the-default-branch/
원격 리포지토리의 기본 분기를 확인하는 데 git 명령이 사용 가능합니까?
마스터가 아닌 경우 기본 분기를 탐지하는 방법을 찾았습니다.
git remote show [your_remote] | sed -n '/HEAD branch/s/.*: //p'
( 많은 상황에서 gitlab과 같은 )[your_remote]▁▁be 될 것입니다.origin, 친구들아.git remote리모컨의 이름을 확인
Github에서 복제한 보고서에서 Git 2.9.4로 테스트(다른 버전에서는 작동 가능):
git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
샘플 출력:
master
git rev-parse --abbrev-ref origin/HEAD를 합니다.origin/<default-branch-name>답들은 같은 일을 하고 있지만 더 긴 논쟁이 필요합니다.
에 약에만.origin이름을 "" " " " " " 을 변경합니다.git remote set-head origin -a새 기본 분기 이름을 검색합니다.
아직까지는 복제가 필요 없는 답은 없는 것 같습니다.
Git 2.8.0 이상이 필요합니다.
$ git ls-remote --symref git@github.com:pre-commit/pre-commit.github.io HEAD
ref: refs/heads/real_master HEAD
e100a6a3c72b4e54f0d176f791dfd2dbd7eb5fa7 HEAD
이 질문은 좀 오래된 질문입니다만, 최근에 이 질문을 접한 사람이 있다면...
git remote show <remote_name> | awk '/HEAD branch/ {print $NF}'
또한 공백이나 기타 넌센스는 포함하지 않고 분기 이름만 표시됩니다.
나는 이것을 몇 개의 Git 별칭을 사용하여 저장하고 싶습니다(나는 이와 같은 유용한 별칭을 많이 가지고 있습니다).
upstream-name = !git remote | egrep -o '(upstream|origin)' | tail -1
head-branch = !git remote show $(git upstream-name) | awk '/HEAD branch/ {print $NF}'
"업스트림"과 "오리진"을 거의 100% 리모컨으로 사용합니다("Fork & Pull 워크플로우를 사용할 때는 "업스트림"...).종종).사용 사례에는 다음이 필요하지 않을 수 있습니다.upstream-name에일리어스, 저는 그저 그것이 유용하다고 생각해요.
git symbolic-ref에는 --short 옵션이 있습니다.그래서 제가 선호하는 명령은:
$ basename $(git symbolic-ref --short refs/remotes/origin/HEAD)
master
다음 명령은 원격 이름을 지정한 방법에 관계없이 HEAD 분기를 나열합니다.
git branch --remotes --list '*/HEAD'
여기서 다음과 같은 기본 분기를 추출할 수 있습니다.
git branch -rl '*/HEAD' | rev | cut -d/ -f1 | rev
의 (짧은변모사용델형▁shortusinggit branch인수).
에 셸다음없경우는이에▁the가 없는 rev령명, 사할수있다를 할 수 .awk대신:
git branch -rl '*/HEAD' | awk -F/ '{print $NF}'
다른 답변자들이 지적했듯이, 기본 분기의 개념은 GitHub의 (높은 의미에서) Git의 말이 되지 않는다는 것입니다(여기에는 https://stackoverflow.com/a/65710958/2521092) 이라는 상당히 좋은 (충분히 과소평가된 경우) 코멘트가 약간 포함되지만 실제로는 모두 그것이 무엇을 의미하는지 알고 있습니다).
이 질문의 원래 질문 이후, Git 2.28은 다음과 같이 덧붙였습니다.init.defaultBranch 분허기용과 다른 초기 master그리고 많은 프로젝트들이 현재 사용하고 있습니다.main.좋다.여기서 대부분의 답변은 원격을 확인하는 데 의존하지만, 실제로 원격이 있는지, 그리고 이러한 원격에 대한 신뢰할 수 있고 일관된 이름 지정 체계가 존재하는지에 의존합니다.그것들은 아마도 (점증적으로) 합리적인 가정일 것이지만, 그것은 보장이 아니며, 저는 여기서 주요 답변 중 어떤 것도 좋게 실패한다고 생각하지 않습니다.
저주사예에칭별다사례별양칭한는용다요니것입사는용이, Git 을하름치랜브대한본기의한또▁g예에▁moreover▁for▁is▁(it▁default▁branch▁my다것니별칭입▁main▁usinge▁g▁case▁the▁use▁various)에 대해 기본 분기 을 사용하는 것이 주요 사용 사례입니다.lm = log main..HEAD ) 사용하지 않고 사용하고 master 는지역사용적을 사용하여 합니다.main리모콘이 없는Git와 Git의 구성은 정보를 "저장"할 수 없기 때문에 현재 저장소의 주요 분기를 미리 설정할 수 없습니다.와 같이,과 HEAD 을 보여주고자은 따서라, 를들어예사, 과주지 HEAD 이는표커별다칭을 가정할 수 .git log master..HEAD또는git log main..HEAD효과가 있을 것입니다.
따라서, 나는 정의합니다.default-branch기본 분기를 파악한 다음 다른 별칭으로 제공하는 Git의 별칭입니다.이것은 단순하기 때문에 고통입니다.lm = log main..HEAD에 신해합니다야대가 되어야 .lm = "!git log $(git default-branch)..HEAD"하지만 우리는 여기 있습니다.
default-branch = "!git branch --sort=-refname | grep -o -m1 '\\b\\(main\\|master\\|dev\\)\\b'"
이렇게 하면 단순히 분기 이름을 가져온 다음 정의된 목록에서 첫 번째 이름을 찾습니다.있약다면이 ,main그것을 사용하세요; 만약 그렇지 않다면 그리고 그것이 있습니다.master그것을 사용합니다.저도 있습니다.dev어떤 사람들은 3차 옵션으로 그곳에서 사용합니다.
이것은 https://stackoverflow.com/a/66622363/2521092, 에서 @dkk-n이 하는 것과 약간 비슷하지만 저는 셸보다는 Git 자체에서 그것을 하고 있고, 저는 그것이 더 많은 선택권을 가지고 있다고 생각합니다.
이는 ghcli 도구(테스트된 v2.0.0)를 사용하여 얻을 수 있습니다.
gh repo view --json defaultBranchRef --jq .defaultBranchRef.name
다른 모든 대답들은 너무 많은 추측을 했습니다. 이것이 저에게 효과가 있는 유일한 방법입니다.이것은 당신이 현재 어떤 지점에 있든지 상관없이 작동하며, 그것을 가정하지 않습니다.origin/HEADref는 로컬로 존재하며 변경된 경우에도 항상 현재 기본 분기를 반영합니다.
유일한 단점은 로컬을 변경한다는 것입니다.origin/HEAD되지 .ref, 하지일으문그되않지습다니제가것은로반적.
이 깃을 할 수 .origin/HEAD자동으로 사용할 분기 결정:
$ git remote set-head origin --auto
origin/HEAD set to main
그런 다음 기본 분기의 이름이 포함된 문자열을 가져옵니다.
$ git rev-parse --abbrev-ref origin/HEAD
origin/main
또는 한 줄 솔루션의 경우:
$ git remote set-head origin --auto >/dev/null 2>&1 && git rev-parse --abbrev-ref origin/HEAD
origin/main
저는 단지 셸 스크립트가 브랜치가 "마스터"인지 "메인"인지 알기를 원했습니다.
이러한 목적을 위해 다음과 같이 충분히 좋습니다.
[ -f "$(git rev-parse --show-toplevel)/.git/refs/heads/master" ] && echo master || echo main
항상 repo의 루트 디렉토리에서 호출된다는 것을 알고 있다면, 다음과 같이 단순화할 수 있습니다.
[ -f .git/refs/heads/master ] && echo master || echo main
저는 이것을 제 Git 별명에 그렇게 사용하고 있습니다: https://github.com/henrik/dotfiles/commit/6815bd95770afab2936fb6202b1ee5e82cb9662b
이 질문처럼 다른 Git 서버가 아닌 GitHub 기본 브랜치를 가져오려고 하는 경우:
GitHub API를 사용하여 기본 브랜치를 가져올 수 있습니다.그것은default_branch응답 필드:
$ curl -s https://api.github.com/repos/darthwalsh/bootstrappingCIL | \
jq --raw-output .default_branch
master
이것은 GitHub에서 복제된 저장소를 사용하여 Git 2.1.10에서 작동합니다.
git branch -r --points-at refs/remotes/origin/HEAD
이 접근 방식의 주요 문제는 HEAD를 가리키는 모든 원격 분기가 나열된다는 것입니다. 그러나 출력에는 다음과 같은 힌트가 포함됩니다.
origin/HEAD -> origin/master
origin/master
origin/test123
따라서 다음을 사용하여 출력을 후처리할 수 있습니다.grep또는 화살표가 있는 것을 찾는 것과 유사합니다.
git branch -r --points-at refs/remotes/origin/HEAD | grep '\->' | cut -d' ' -f5 | cut -d/ -f2
git 2.28.0 이상부터:
$ git config --get init.defaultBranch || echo master
원격 리포지토리의 기본 분기를 확인하는 데 git 명령이 사용 가능합니까?
여기에는 기본 로컬 리포지토리 분기가 나열됩니다.
git rev-parse --abbrev-ref origin/HEAD
GitHub API는 CLI를 사용하여 기본 분기를 표시할 수 있습니다.
gh api /repos/{owner}/{repo} --jq '.default_branch'
약간의 해결책인 것처럼 보이지만, 이것은 효과가 있는 것 같습니다.
$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master
다른 답변을 토대로 다른 답변을 추가하겠습니다.원격 쿼리가 느리기 때문에 다른 답변은 좋아하지 않았지만 "로컬 전용" 솔루션도 원하지 않았습니다.
다음(긴) 별칭을 사용합니다.
head-branch = "!f() { gitHeadsDir=\"$(git rev-parse --show-toplevel)/.git/refs/heads\"; if [ -f \"$gitHeadsDir/main\" ]; then echo 'main'; elif [ -f \"$gitHeadsDir/master\" ]; then echo 'master'; else git remote show origin | grep 'HEAD branch' | cut -d' ' -f5; fi; }; f"
위의 내용은 기본적으로 다음과 같습니다.
- 라는지지라는
main해당 , 용존을 사용합니다. - 라는지지라는
master해당 , 용존을 사용합니다. - 그렇지 않으면 리모컨을 다시 확인합니다(훨씬 더 느림).
이 기능은 다음을 포함한 99%의 사용 사례(및 모든 사용 사례)에 적용됩니다.
- 복제된 "일반" 저장소 복제
- 원격(아직)이 없을 수도 있는 완전히 새로운 저장소.
이름이 지정된 로컬 분기를 만들어도 이를 쉽게 "파기"할 수 있습니다.main또는master(또는 둘 다), 실제로는 기본 분기가 아닐지라도.이 " " " " " " " " " " " " " " " " " " " " " " 이 아닐 에도 이 가 발생합니다.main또는master하지만 그런 경우라면 당신은 그것을 깨려고 할 가능성이 높습니다. ;-)
확해보다니습을 하고 있습니다.main 번째, 둘 다 첫당이둘다가있다지면고신만약째▁if있▁first면다▁both▁since가,▁you고▁have지,다.main 그리고. master당신은 아마도 에서 전환하는 과정에 있을 것입니다.mastermain.
언급URL : https://stackoverflow.com/questions/28666357/how-to-get-default-git-branch
'programing' 카테고리의 다른 글
| 여러 데이터베이스 서버에 대해 구문을 확인할 수 있는 SQL Validator가 있습니까? (0) | 2023.07.16 |
|---|---|
| C#: OracleDb와 Oracle 데이터 유형의 동등성유형 (0) | 2023.07.16 |
| 도짓 태그도 밀립니까? (0) | 2023.07.11 |
| 해당 값으로 연결된 키 선택 (0) | 2023.07.11 |
| VBA 웹 서버에서 UTF-8 CSV 파일 가져오기 (0) | 2023.07.11 |