source

현재 git 브랜치의 이름을 셸 스크립트의 변수로 가져오는 방법은 무엇입니까?

manysource 2023. 5. 15. 22:22

현재 git 브랜치의 이름을 셸 스크립트의 변수로 가져오는 방법은 무엇입니까?

저는 셸 스크립팅에 익숙하지 않아서 이것을 이해할 수 없습니다.익숙하지 않은 경우 gitbranch 명령은 다음과 같은 것을 반환합니다.

* develop
  master

여기서 별표는 현재 체크아웃된 분기를 나타냅니다.터미널에서 다음을 실행할 때:

git branch | grep "*"

이해합니다.

* develop

역시

하지만, 내가 달릴 때

test=$(git branch | grep "*")

또는

test=`git branch | grep "*"`

그리고 나서.

echo $test

결과는 디렉터리에 있는 파일 목록일 뿐입니다.test="* develop"의 가치를 어떻게 만들 수 있습니까?

다음 단계("* develop"이 테스트라는 변수로 전환되면)는 부분 문자열을 얻는 것입니다.그것은 단지 다음과 같습니까?

currentBranch=${test:2} 

그 서브스트링 기능을 가지고 장난을 치다가 '나쁜 대체' 오류가 많이 나서 이유를 모르겠습니다.

Noufal Ibrahim의 답변을 확장하여, 다음을 사용합니다.--short로깃을든발로 기치를 git-symbolic-ref을 가지고 야단법석을 떨 필요가 없는sed.

저는 이와 같은 것을 훅으로 사용해 왔고 그것은 잘 작동합니다.

#!/bin/bash

branch=$(git symbolic-ref --short HEAD)

echo
echo "**** Running post-commit hook from branch $branch"
echo

그러면 "**** 분기 마스터에서 커밋 후 후크 실행"이 출력됩니다.

:git-symbolic-ref저장소에 있는 경우에만 작동합니다. 좋게도..git/HEADGit의 초기 시절의 잔재로서, 동일한 상징적인 ref를 포함하고 있습니다.디렉터리를 이동하지 않고 여러 git 저장소의 활성 분기를 가져오려면 다음과 같은 bash 원라이너를 사용할 수 있습니다.

for repo in */.git; do branch=$(cat $repo/HEAD); echo ${repo%/.git} :  ${branch##*/}; done

이는 다음과 같은 결과를 출력합니다.

repo1 : master  
repo2 : dev  
repo3 : issue12

더 나아가려면 다음에 포함된 전체 ref.git/HEAD또한 지점의 마지막 커밋의 SHA-1 해시를 포함하는 파일에 대한 상대 경로입니다.

*를 확장하면 grep 대신 사용하여 브랜치 이름을 즉시 가져옵니다.

branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')

그리고 누팔 이브라힘이 제안한 git symbolic-ref를 사용한 버전.

branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

( 그랬던처럼) 때 합니다.echo $test와 함께$test중을 * master 다음에 그음에다.*는 일반 확장 규칙에 따라 확장됩니다.마르코가 해야 할 것입니다.echo "$test"또는 에코하기 전에 별표를 제거하면 모든 것이 정상입니다.echo ${test:2}그냥 메아리칠 것입니다.master또는 이미 제안한 대로 새로 할당할 수 있습니다.

branch=${test:2}
echo $branch

이것은 반향을 일으킬 것입니다.master당신이 원했던 것처럼.

나는 그것을 사용할 것입니다.git-symbolic-refgit core에서 명령을 수행합니다.라고 한다면git-symbolic-ref HEAD현재 분기의 이름이 표시됩니다.

사용합니다.git describe --contains --all HEAD내 git 도우미 스크립트에서.

예:

#!/bin/bash
branchname=$(git describe --contains --all HEAD)
git pull --rebase origin $branchname

나는 그것을 파일에 가지고 있습니다.gpull~/scripts

편집:

대부분의 CI 환경에서는 "분리된 헤드" 상태에서 코드를 체크아웃하므로 다음을 사용합니다.

BRANCH=$(\
  git for-each-ref \
  --format='%(objectname) %(refname:short)' refs/heads \
  | awk "/^$(git rev-parse HEAD)/ {print \$2}"\
)

문제의 원인은 다음과 같습니다.

echo $test

실제로 변수 테스트에는 셸에 의해 확장된 와일드카드가 포함되어 있습니다.이중 따옴표를 사용하여 $test를 보호하면 됩니다.

echo "$test"

하위 셸 글로벌 확장 사용 안 함,

test=$(set -f; git branch)

언급URL : https://stackoverflow.com/questions/2111042/how-to-get-the-name-of-the-current-git-branch-into-a-variable-in-a-shell-script