gpt4 book ai didi

git - 跳过处理先前已经处理过的 post-receive Hook 中的 Git 修订

转载 作者:太空狗 更新时间:2023-10-29 13:52:13 24 4
gpt4 key购买 nike

我有一个 git post-receive Hook ,它提取在“git push”期间添加的所有修订,并对每个修订进行一些处理(例如发送通知电子邮件)。除了 merge 时,这很好用;例如:

  1. 我在 branch1 上做了一些提交,然后推送 branch1。接收后 Hook 正确处理提交。
  2. 我将 branch1 merge 到 branch2,然后推送 branch2。接收后 Hook 第二次处理所有 merge 的提交。

我怎样才能避免这种情况?下面是我的接收后 Hook 的开头,我在其中提取了应该处理的提交(最后 $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

最佳答案

查看 $(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

(我在这里简化了它,希望在我的剪切和粘贴工作中没有损坏任何东西。这里的输入是:$change_type is create if $oldrev 为全零,否则为 update$oldrev 是最近从 stdin 读取的行中的旧 rev SHA1; $newrev 是新的 rev SHA1;$refname 是全名,例如,refs/heads/topic。)

关于git - 跳过处理先前已经处理过的 post-receive Hook 中的 Git 修订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com