Mat*_*ite 3 git git-post-receive
我有一个git post-receive钩子,它提取了在"git push"期间添加的所有修订版,并对每个修订版进行了一些处理(例如发送通知电子邮件).这种方法很有效,除非合并时; 例如:
我怎么能避免这个?下面是我的post-receive钩子的开头,我提取了应该处理的提交(最后$ COMMITS保存了要处理的提交列表).
#!/bin/sh
REPO_PATH=`pwd`
COMMITS=''
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# for each ref that was updated during the push
while read OLD_REV NEW_REV REF_NAME; do
OLD_REV="`git rev-parse $OLD_REV`"
NEW_REV="`git rev-parse $NEW_REV`"
if expr "$OLD_REV" : '0*$' >/dev/null; then
# if the branch was created, add all revisions in the new branch; skip tags
if ! expr "$REF_NAME" : 'refs/tags/' >/dev/null; then
REF_REV="`git rev-parse $REF_NAME`"
REF_NAME="`git name-rev --name-only $REF_REV`"
COMMITS="$COMMITS `git rev-list $REF_NAME | git name-rev --stdin | grep -G \($REF_NAME.*\) | awk '{ print $1 }' | tr '\n' ' '`"
fi
elif expr "$NEW_REV" : '0*$' >/dev/null; then
# don't think branch deletes ever hit a post-receive hook, so we should never get here
printf ''
else
# add any commits in this push
COMMITS="$COMMITS `git rev-parse --not --all | grep -v $(git rev-parse $REF_NAME) | git rev-list --reverse --stdin $(git merge-base $OLD_REV $NEW_REV)..$NEW_REV | tr '\n' ' '`"
fi
done
Run Code Online (Sandbox Code Playgroud)
看看$(prefix)/share/git-core/contrib/hooks/post-receive-email,这就是你想要的(我认为).基本上它用于git for-each-ref查找所有分支的名称,然后排除除了正在更新的分支以外的某个分支可以访问的每个提交:
if [ "$change_type" = create ]
then
# Show all revisions exclusive to this (new) branch.
revspec=$newrev
else
# Branch update; show revisions not part of $oldrev.
revspec=$oldrev..$newrev
fi
other_branches=$(git for-each-ref --format='%(refname)' refs/heads/ |
grep -F -v $refname)
git rev-parse --not $other_branches | git rev-list --pretty --stdin $revspec
Run Code Online (Sandbox Code Playgroud)
(我在这里简化它,并希望没有损坏我的剪切和粘贴的东西在这里输入是:$change_type是create,如果$oldrev是全零,否则就update; $oldrev从行老转SHA1从标准输入最近阅读; $newrev是新的rev SHA1;并且$refname是全名,例如refs/heads/topic.)
| 归档时间: |
|
| 查看次数: |
1595 次 |
| 最近记录: |