我有以下场景:两个远程裸存储库 repo1 和 repo2。他们应该共享一个分支,即事实上有关于特定分支的定期推送到 repo1。这些更改应同步到 repo2。
我认为,同步意味着类似于基于钩子或某物的自动拉动。像这样。
您有什么想法,如何满足上述要求?
非常感谢!
我有以下场景:两个远程裸存储库 repo1 和 repo2。他们应该共享一个分支,即事实上有关于特定分支的定期推送到 repo1。这些更改应同步到 repo2。
我认为,同步意味着类似于基于钩子或某物的自动拉动。像这样。
您有什么想法,如何满足上述要求?
非常感谢!
设置一个将转发更改的挂钩。您可以从四个挂钩中选择:pre-receive
、update
和。post-receive
post-update
前两个在推送期间运行,因此它们会减慢速度,但可以中止它。后两者在推送之后运行,因此用户不必等待它们,但它们不能中止它并且需要单独的方法来通知错误。
代码将大部分相似并且非常简单。简单post-update
(文件hooks/post-update
in 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 调用一次,所以没有循环。参数为 ref 名称、旧 SHA1 和新 SHA1,并且推送需要使用新 SHA1,因为本地 ref 尚未更新。