同步两个裸存储库的分支

时间:2013-01-02 09:07:50

标签: git git-branch

我有以下场景:两个远程裸存储库repo1和repo2。他们应该共享一个分支,即实际上有关于特定分支的定期推送repo1。这些变化应该与repo2同步。

我认为,同步意味着基于钩子或某事的自动拉动。像这样。

您是否有想法,如何满足上述要求?

非常感谢!

1 个答案:

答案 0 :(得分:2)

设置一个可以转发更改的挂钩。您可以选择四个挂钩:pre-receiveupdatepost-receivepost-update

前两个在推送期间运行,因此它们减慢速度,但可以中止它。后两个在推送之后运行,因此用户不必等待它们,但是它们不能中止它并且需要单独的方法来通知错误。

代码将大致相似且非常简单。简单post-updatehooks/post-update)变体中的文件repo1将为:

#!/bin/sh
for ref; do
    if [ refs/heads/branch-to-mirror = "$ref" ]; then
        git push repo2 "$ref"
    fi
done

pre-receive / update需要说git push repo2 $newsha:branch-to-mirror,因为本地分支尚未更新。条件当然可以不同;任何会告诉分支应该在repo2镜像的内容。

update挂钩,如果无法转发到repo1,则会将推送中止到repo2

#!/bin/sh
set -e
if [ refs/heads/branch-to-mirror = "$1" ]; then
    git push repo2 "$3:$1"
fi

set -e用于将错误传播出脚本。或者,可以将|| exit 1添加到应该传播的命令失败中。对于每个更新的ref,都会调用此挂钩一次,因此没有循环。参数是引用名称,旧SHA1和新SHA1,并且push需要使用新的SHA1,因为本地引用尚未更新。