programing

기본 Git 분기를 가져오는 방법?

telebox 2023. 7. 11. 22:52
반응형

기본 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

반응형