在git中结帐远程分支

时间:2012-10-07 22:43:17

标签: git branch commit

我已将/var/www/website设置为(非裸)repo,并拥有我的裸仓库的更新后挂钩:

#!/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

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

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

有没有办法在远程(非裸)回购中办理结账?

1 个答案:

答案 0 :(得分:1)

更新后挂钩获取已更新的所有引用的名称。这些是位置参数($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中思考”。 :-)当你进行推送时(从你自己的一些回购副本到​​一些其他副本,无论是否有一些回购),如果你改变了你的观点,你可能会发现结果更容易理解。你可以从“我正在推动”开始,然后你可以想象远程回购作为其他演员,让我给他一个名字并称他为“鲍勃”,并想想鲍勃所看到的。从鲍勃的角度来看,鲍勃不是说“Yekver正在推送东西”,而是认为:“我,鲍勃,我从那里的那个Yekver那里得到了一些东西并将它放入我的仓库。我正在添加标签参考/标签/ v1。 1,我正在进行一些提交并将它们放入我的refs / heads / master中,我正在进行更多提交并将它们放入我的refs / heads / devel-xyz中。“

这里的关键概念是,就git而言,一切都是本地的。从鲍勃的角度来看,鲍勃的回购是本地的。一个名叫Yekver的人可能会有一个基于此的回购,但Bob的副本是Bob的副本。 Bob使用Bob的本地仓库做本地事务,当你在这些钩子脚本中工作时,你就是“成为Bob”。