我有以下场景:两个远程裸存储库repo1和repo2。他们应该共享一个分支,即实际上有关于特定分支的定期推送repo1。这些变化应该与repo2同步。
我认为,同步意味着基于钩子或某事的自动拉动。像这样。
您是否有想法,如何满足上述要求?
非常感谢!
答案 0 :(得分:2)
设置一个可以转发更改的挂钩。您可以选择四个挂钩:pre-receive
,update
,post-receive
和post-update
。
前两个在推送期间运行,因此它们减慢速度,但可以中止它。后两个在推送之后运行,因此用户不必等待它们,但是它们不能中止它并且需要单独的方法来通知错误。
代码将大致相似且非常简单。简单post-update
(hooks/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,因为本地引用尚未更新。