2015-04-01 108 views
1

我正在處理我的git服務器的後期接收,以便它自動上傳我的網站的最新版本在提交所在的分支後命名的文件夾中,但是以某種方式執行此代碼不能按預期工作。無法在bash中獲得正確的git分支名稱

不知何故,我的值分支獲取所有分支的值,而不是我試圖獲取的分支。散列確實得到正確的散列碼。我已經在程序之外測試了它,當我輸入正確的哈希時,分支也是如此。我在這個程序中使用了錯誤的語法嗎?

#!/bin/sh 
hash=$(git log -n 1 --pretty=format:"%h") 
branch=$(git branch --contains $(git log -n 1 --pretty=format:"%H")) 
if [ branch ] 
then 
    GIT_WORK_TREE="/data/site/'$branch'" 
    echo "/data/site/'$branch'" 
    git checkout -f $branch 
fi 
+3

你看錯了方向:一般來說,沒有唯一的分支提交明確屬於。看到我的這個答案:http://stackoverflow.com/questions/29257491/which-branch-do-commits-from-a-deleted-branch-belong-to/29258814#29258814 – Jubobs 2015-04-01 13:46:35

+2

由於Jubobs說一個提交沒有有「** a **分支」。一些分支上存在提交(以達到它爲準)。 – 2015-04-01 13:53:31

+1

爲什麼你在做所有這些工作,當git post-receive hook在stdin上獲取_oldrev newrev refname_ triplets?如果有多個名稱,您仍然需要選擇所需的那些名稱,但它應該是一個開始。 – Useless 2015-04-01 13:54:18

回答

1

好吧,我按照自己的意願去工作了!在聽說post-receive將refname命名爲stdin之後,發現我不得不修剪refname以僅獲取分支名稱,並提出了這一點代碼。多謝你們。 :)

#!/bin/sh 
while read oldrev newrev refname 
do 
    branch=${refname##*/} 
    if [ branch ] 
    then 
     path="/data/site/$branch" 
     mkdir $path 
     unset GIT_INDEX_FILE 
     export GIT_WORK_TREE=$path 
     git checkout -f $refname 
     echo "Successfully pushed to $path" 
    fi 
done 
+0

你有什麼似乎是語法錯誤 - 你正在做'如果[分支]',但這只是'['固定字符串'分支'作爲第一個參數,而不是'$ branch'變量的值。 – 2015-05-03 13:19:13

+0

我用它來檢查分支是否有值。我讀過這樣做,如果分支爲空,則返回false,如果它有值,則返回true。 – Dracedragon 2015-05-04 14:35:01

+0

如果你有shell通過說'$ branch'來擴展變量分支,那麼是的。否則,你只是測試六個字母的字符串「分支」是否是非空的,它總是會是。您需要添加美元符號。 :) – 2015-05-06 08:30:54