현재 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/HEAD
Git의 초기 시절의 잔재로서, 동일한 상징적인 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-ref
git 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
'source' 카테고리의 다른 글
Angular2에서 괄호, 괄호 및 별표의 차이점은 무엇입니까? (0) | 2023.05.20 |
---|---|
Mongoose - 문자열 배열 저장 (0) | 2023.05.15 |
sudo service mongodb restart는 Ubuntu 14.0.4에서 "비활성화된 서비스 오류"를 제공합니다. (0) | 2023.05.15 |
require를 통해 호출되는지 아니면 명령줄을 통해 직접 호출되는지 탐지 (0) | 2023.05.15 |
fatal: 초기 EOF fatal: 인덱스 팩 실패 (0) | 2023.05.15 |