我的项目的目的是将开发人员提交的每个提交记录到mongodb中。我已经设置了一个 nodejs监听器,用于将帖子上收到的数据保存到mongo。
我正在运行一个gitolite服务器,每次开发人员推送时我都会使用post-receive挂钩通过curl将提交发布到我的节点监听器。
我成功地执行了此操作,除了旧版本为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 log而不包含任何修订信息,并避免使用项目名称/ git commit id向我的集合添加重复提交。但是在大型存储库中这会很慢。
答案 0 :(得分:1)
不确定它是否会对此有所帮助,但在pre-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
最后一个哈希是空存储库的哈希值,并被硬编码为git。