post-update 挂钩获取所有已更新的引用的名称。这些将是位置参数($1
、$2
等)。你必须决定如何处理每一个。
例如,这个有点傻的更新后脚本:
#! /bin/sh
for ref do
case $ref in
refs/heads/*) echo "a branch ($ref) was updated";;
refs/tags/*) echo "a tag ($ref) was updated";;
*) echo "something I don't understand ($ref) was updated";;
esac
done
只需打印出所有更新的全名。
让它不那么愚蠢,假设我们想要捕捉分支更新并用它们做一些有用的事情。用更复杂的东西替换第一个回声:
refs/heads/*) branch_update $ref;;
当然,我们必须定义一个 branch_update 函数。这是新脚本(它仍然没有做任何事情,但有明显的地方可以做某事):
#! /bin/sh
branch_update() {
local shortname=${1#refs/heads/}
echo "branch $shortname is being updated"
case $shortname in
master) echo "master is updated, do something";;
work) echo "work branch is updated, do something else";;
*) echo "it's not a magic branch, do nothing";;
esac
}
for ref do
case $ref in
refs/heads/*) branch_update $ref;;
refs/tags/*) echo "a tag ($ref) was updated";;
*) echo "something I don't understand ($ref) was updated";;
esac
done
另外:您的问题的措辞方式表明您并没有像以前那样“在 git 中思考”。:-) 当您进行推送时(从您自己的某个 repo 副本到某个 repo 的其他副本,无论是否裸露),如果您改变观点,您可能会发现结果更容易理解。您可以从“我在推动”开始,然后您可以将远程仓库想象为其他演员,让我们给他一个名字并称他为“鲍勃”,然后想想鲍勃看到了什么。从 Bob 的角度来看,而不是“Yekver 正在推动东西”,Bob 认为:“我,Bob,正在从那边的 Yekver 人那里得到一些东西并将其放入我的 repo。我正在添加标签 refs/tags/v1。 1,我正在接受一些提交并将它们放在我的 refs/heads/master 中,我'
这里的关键概念是,就 git 所做的而言,一切都是本地的。从 Bob 的角度来看,Bob 的 repo 是本地的。一些名叫 Yekver 的人可能有一个基于此的 repo,但 Bob 的副本是 Bob 的。Bob 使用 Bob 的本地 repo 做本地事情,当你在这些钩子脚本中工作时,你就是“成为 Bob”。