我想自动将 post-receive 钩子中的提交从我们 LAN 上的中央仓库推送到云中的另一个中央仓库。LAN 存储库是使用git clone --mirror git@cloud:/path/to/repo
或等效命令创建的。
因为提交的文件相对于我们的上游带宽来说会很大,所以完全有可能发生这样的事情:
- Alice 发起对 LAN 存储库的推送。
- 当 post-receive 钩子运行时,Bill 从 LAN 存储库中提取。
- LAN 存储库正在推送到云存储库。
- 这也意味着 Bill 的本地仓库包含 Alice 推送的提交。通过测试确认。
- Bill 启动了对 LAN 存储库的推送。
- Bill 的推送是 Alice 推送的快进,因此 LAN repo 将接受它。
当 LAN repo 的 post-receive 钩子执行时,将启动从 LAN repo 到云 repo 的第二次推送,并且两者将同时运行。
我不担心 git 对象。最坏的情况是两个推送都从 Alice 的推送中上传所有对象,但据我了解 git 的内部结构,这无关紧要。
我担心裁判。假设 Alice 使用慢得多的连接进行推送,因此 Bill 的推送首先完成。假设数据包丢失或其他原因导致钩子从 LAN 存储库推送到 Bill 的推送云之前完成,然后钩子从 LAN 存储库推送到 Alice 的推送云。如果 Alice 和 Bill 都在推送 master 分支并且 Bill 的推送首先完成,那么 master ref 在云存储库上会是什么?我希望它是 Bill 的 HEAD,因为那是后来的推送,但我担心它会是 Alice 的 HEAD。
进一步澄清:
我意识到如果 Bill 从他的机器推送到 LAN 存储库首先完成,Alice 从她的机器到 LAN 存储库的推送将失败。在这种情况下,LAN repo 的 post-receive 钩子将不会执行。此外,请假设没有人会强制推送,所以如果 post-receive 钩子在 LAN repo 上运行,所有 ref 更改都是快进的。