1

我已经设置/var/www/website为(非裸)回购,并有我的裸回购的更新后挂钩:

#!/bin/sh

echo
echo "**** Pulling changes into Live [Hub's post-update hook]"
echo

cd /var/www/website || exit
unset GIT_DIR
git pull hub master

exec git-update-server-info

因为我想在推送后立即看到网站上的变化。

但是,如果我创建远程分支,在我的本地仓库中使用它,然后在其中提交和推送更改,我无法在网站上看到它们(我总是看到 master)。

有没有办法在远程(非裸)回购中进行结帐?

4

1 回答 1

1

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”。

于 2012-10-07T23:38:19.663 回答