當前位置: 首頁>>技術問答>>正文


如何將當前git分支的名稱轉換為shell腳本中的變量?

, , , ,

問題描述

我是shell腳本的新手,無法解決這個問題。如果您不熟悉,命令git branch會返回類似的內容

* develop
  master

,星號標記當前簽出的分支。當我在終端中運行以下內容時:

git branch | grep "*"

我明白了:

* develop

正如所料。

但是,當我跑

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

要麽

test=`git branch | grep "*"`

然後

echo $test

,結果隻是目錄中的文件列表。我們如何使test =“* develop”的價值?

然後下一步(一旦我們將“* develop”變成一個名為test的變量),就是得到子串。這隻是以下幾點嗎?

currentBranch=${test:2} 

我正在玩那個子串函數,我得到了很多”bad substitution”錯誤,不知道為什麽。

最佳解決方案

*被擴展,你可以做的是使用sed而不是grep並立即得到分支的名稱:

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

和Noufal Ibrahim建議的使用git symbolic-ref的版本

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

為了詳細說明擴展(如marco已經做的那樣),擴展發生在echo中,當你使用$ test包含“* master”進行echo $test時,*會根據正常的擴展規則進行擴展。為了抑製這個,必須引用變量,如marco所示:echo "$test"。或者,如果你在回音之前擺脫了星號,一切都會好的,例如: echo ${test:2}將回複”master”。或者,您可以按照您的建議重新分配:

branch=${test:2}
echo $branch

這將回複”master”,就像你想要的那樣。

次佳解決方案

Noufal Ibrahim’s answer上擴展,使用帶有git-symbolic-ref--short標誌,無需對sed大驚小怪。

我一直在鉤子中使用這樣的東西,它運作良好:

#!/bin/bash

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

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

輸出“****從分支主機運行post-commit鉤子”

請注意,git-symbolic-ref僅在您位於存儲庫中時才有效。幸運的是,.git/HEAD作為Git早期的遺留物,含有相同的符號引用。如果你想獲得幾個git存儲庫的活動分支,而不遍曆目錄,你可以像這樣使用bash one-liner:

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

哪個輸出如下:

repo1 : master  
repo2 : dev  
repo3 : issue12

如果你想更進一步,.git/HEAD中包含的完整引用也是包含分支最後一次提交的SHA-1哈希的文件的相對路徑。

第三種解決方案

我會在git核心中使用git-symbolic-ref命令。如果您說git-symbolic-ref HEAD,您將獲得當前分支的名稱。

第四種方案

我在我的git helper腳本中使用了這個git describe --contains --all HEAD

例:

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

我在~/scripts中名為gpull的文件中有這個

編輯:

對於很多CI環境,他們會在”detached head”狀態下檢查你的代碼,然後我將使用:

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

第五種方案

問題依賴於:

echo $test

事實上,變量測試包含一個由shell擴展的通配符。為了避免這種情況,隻需使用雙引號保護$ test:

echo "$test"

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/6789.html,未經允許,請勿轉載。