2012-02-14 38 views
0

我的项目的目的是记录每一个承诺由开发到MongoDB的制造。我已经建立了一个nodejs监听器,它可以将收到的数据保存到mongo。与发送提交数据的问题后获得通过卷曲(GIT)挂钩

我运行gitolite服务器,每一个开发商推一次,我使用后收到钩通过卷曲提交张贴到我的节点收听。

我成功地做到这一点,除了初始提交,其中旧版本是0000000000000000000000000000000000000000当我尝试运行git log时,我得到一个无效的参数。

模棱两可的说法 '8a2db961045bd4825624b16ad62e75be49dd70b6〜1..8a2db961045bd4825624b16ad62e75be49dd70b6': 未知的修订或路径不工作的树。使用' - '分隔 修订路径

从我的bash/post-receive脚本摘录如下。

#!/bin/sh 
# Read git data on STDIN 
while read oval nval ref ; do 
    if expr "$ref" : "^refs/heads/"; then 
     if expr "$oval" : '0*$' >/dev/null 
     then 
      revspec=$nval 
     else 
      revspec=$oval..$nval 
     fi 
     other_branches=$(git for-each-ref --format='%(refname)' refs/heads/ | 
      grep -F -v $ref) 

     # Get the name of the repository 
     if [ $(git rev-parse --is-bare-repository) = true ] 
     then 
       REPOSITORY_BASENAME=$(basename "$PWD") 
     else 
       REPOSITORY_BASENAME=$(basename $(readlink -nf "$PWD"/..)) 
     fi 
     REPOSITORY_BASENAME=${REPOSITORY_BASENAME%.git} 

     for revision in `git rev-parse --not $other_branches | 
      git rev-list --stdin $revspec`; do 
       COMMIT_ID=$(git log $revision~1..$revision --pretty=format:'%H') 
       DATE=$(git log $revision~1..$revision --date=short --pretty=format:'%ad') 
       MSG=$(git log $revision~1..$revision --pretty=format:'%s') 
       AUTHOR=$(git log $revision~1..$revision --pretty=format:'%ae') 
       curl -s 
        -d "commit_id=$COMMIT_ID&date=$DATE&msg=$MSG&author=$AUTHOR&project=$REPOSITORY_BASENAME" 
        $LISTENER_RECEIVE 
     done 
    fi 
done 

我不完全知道如何处理这个在我的bash脚本/与我使用Git命令。

一(懒惰)选项是使用git的日志,任何的修订信息,并避免使用项目名称/ git的承诺ID添加重复的承诺我的收藏。但是这对大型软件仓库来说会很慢。

回答

1

不知道,如果它要在这里帮助,但在commit.sample前钩,他们用这一招:

if git rev-parse --verify HEAD >/dev/null 2>&1 
then 
    against=HEAD 
else 
    # Initial commit: diff against an empty tree object 
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 
fi 

这最后的散列是一个空仓库哈希和硬编码到混帐。