2015-04-01 110 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