명령줄에서 Git 기본 분기 가져오기(Powershell 또는 Bash/Zsh)

경우에 따라 주어진 Git 리포지토리의 기본 분기를 알아야 합니다. 아래에는 다양한 사용 사례에 맞는 방법을 컴파일하고 특정 플랫폼(Github 및 Gitlab)과 원격 플랫폼에 관계없이 보편적으로 작동하는 방법을 다룹니다.

Github API 메소드



repo username/reponame 가 주어지면 다음 스크립트는 wget 도구와 sed가 있는 경우 Bash, Dash/Ash 또는 Zsh에서 작동합니다.

wget -q -O - "https://api.github.com/repos/username/reponame" | sed -nE 's/^\s+"default_branch": "([^"]+).+$/\1/p'

jq가 있는 경우 훨씬 더 간단합니다.

wget -q -O - "https://api.github.com/repos/username/reponame" | jq -r '.default_branch'


또는 선호하는 사람들을 위해curl:

curl -s "https://api.github.com/repos/username/reponame" | jq -r '.default_branch'


이것은 Powershell에서도 매우 쉽습니다.

iwr -useb https://api.github.com/repos/username/reponame | ConvertFrom-Json | select -exp default_branch


요약하면 먼저 주어진 repo에 대한 정보를 쿼리한 다음 반환된 JSON을 구문 분석하여 default_branch 키 값을 추출합니다.

이것은 반복적으로 사용할 수 있는 것입니까? 함수를 빌드하고 다음을 쉘 구성에 배치하는 것을 고려하십시오(예: .bashrc ).

defbranch () {
  REPO=$1
  wget -q -O - "https://api.github.com/repos/$REPO" | sed -nE 's/^\s+"default_branch": "([^"]+).+$/\1/p'
}


부담없이 use this gist

또는 Windows Powershell의 경우 Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 에 다음을 배치합니다.

function defbranch {
  Param ([string]$repo)
  iwr -useb https://api.github.com/repos/$repo | ConvertFrom-Json | select -exp default_branch
}


부담없이 use this gist

Gitlab의 유사한 기능



위의 내용은 특히 Github 설정이기 때문에 Github에만 해당됩니다. Github에서는 빈 저장소라도 master 와 다른 기본 분기를 가질 수 있습니다.

또 다른 인기 있는 "소셜 코딩"서비스인 Gitlab은 기능은 다르지만 비슷합니다. 채워진 저장소에는 기본 분기가 있을 수 있습니다. 빈 것은 그렇지 않습니다.

다음은 Gitlab API( see gist )를 사용하는 예제 함수입니다.

gldefbranch () {
  REPO=$(echo $1 | sed "s/\//%2F/g")
  BRANCH=$(wget -q -O - "https://gitlab.com/api/v4/projects/$REPO" | sed -nE 's/.*"default_branch":"([^"]+).*/\1/p')
  [ "$BRANCH" == null ] && echo master || echo $BRANCH
}


그리고 Powershell에 상응하는 것:

function gldefbranch {
  Param ([string]$repo)
  $repo = $repo.replace("/","%2F")
  $branch = (iwr -useb "https://gitlab.com/api/v4/projects/$repo" | ConvertFrom-Json | select -exp default_branch)
  if ($branch) {
    echo $branch
  } else {
    echo "master"
  }
}


repo가 ​​비어 있지 않은 경우 더 나은 보편적인 접근 방식



내 원래 의도는 리포지토리의 Github 설정을 새롭거나 오래된, 비어 있든 없든 읽는 것이었습니다. 하지만 단순히 기존 repo의 기본 브랜치를 가져오려면 API 호출이 필요하지 않습니다. git ls-remote 를 사용할 수 있습니다.

이러한 제안에 대해 u/Cyberbeni in this Reddit discussion 감사합니다.

원격 저장소의 기본 분기를 쿼리하려면 저장소 URL을 $REPO_URL에 할당하거나 대체하여 다음을 시도하십시오.

git ls-remote --symref "$REPO_URL" HEAD | sed -nE 's|^ref: refs/heads/(\S+)\s+HEAD|\1|p'


또는 동등한 Powershell:

"$(git ls-remote --symref 'https://gitlab.com/bowmanjd/dotfiles1.git' HEAD)" -replace '.*?^ref: refs/heads/(\S+).+','$1'


사용 가능한 경우 로컬 원본/HEAD 참조 가져오기



리포지토리가 git clone 로 다운로드된 경우 origin/HEAD가 자동으로 설정됩니다. 이러한 경우 리모컨을 쿼리할 필요 없이 다음이 빠르게 작동해야 합니다.

git symbolic-ref refs/remotes/origin/HEAD | cut -d '/' -f4


파워쉘에서:

(git symbolic-ref refs/remotes/origin/HEAD) -split '/' | select -Last 1

origin/HEAD를 설정하지 않고도 로컬에서 쉽게 작업이 가능하므로 위의 내용은 신뢰할 수 없습니다.

다시 한 번 u/Cyberbeni for the tip on Reddit 감사합니다.

로컬로 설정된 Git 환경 설정 가져오기



물론 현재 사용자가 선호하는 기본 분기를 알고 싶다면 다음과 같은 결과가 나오거나 설정되지 않은 경우 공백으로 표시됩니다.

git config init.defaultBranch


예를 들어 다음과 같이 이 값을 main로 설정할 수 있습니다.

git config --global init.defaultBranch main


즐거운 스크립팅!

좋은 웹페이지 즐겨찾기