【问题标题】:Automated concurrent git push自动并发 git push
【发布时间】:2017-08-02 07:10:34
【问题描述】:

我想设置一个简单的存储库,其中包含来自不同项目的输出,在 Travis CI 上编译。

我想不通的是如何从 Travis 控制台安全地推送到存储库的最简单方法。如果有两个项目同时在构建,并且恰好同时推送,那么其中一个自然会失败并出现 non-updated refs 错误。

由于每次提交中的路径都保证是唯一的([项目名称]/[提交 id]),因此我能想到的最好的脚本是这样的:

while $(git push) not ok {
    git pull --rebase
}

你能想出更好的办法吗?

【问题讨论】:

  • 您是否将生成的工件推送到 git 存储库?
  • @Code-Apprentice:是的,就是这样。
  • 需要处理这个问题。即使在那次拉动之后,另一个并发作业可能已经开始了它的推送并再次弄乱了你的时间线。换句话说,您将需要一个稍微智能的脚本来检测情况,执行拉取和变基/合并操作,然后重试推送,如果需要再次处理情况。
  • 但是,如果它们是完全独立的,为什么不每个工件只有一个存储库?
  • @LasseV.Karlsen:这将需要更多部署密钥,更难维护/更改等。对于简单的“在此处下载每个项目的当前快照”类型的网站来说太麻烦了。跨度>

标签: git git-push git-pull


【解决方案1】:

一种解决方法是推送到两个不同的分支B1B2,并在服务器端有一个post-receive 挂钩,它将这些分支合并到master

由于每次提交中的路径都保证是唯一的,因此这些合并不会有任何冲突并且可以自动化。

推送到两个不同的分支意味着不应该有任何并发​​问题。

由于远程是 GitHub,另一种方法是在 Travis-CI 端合并这些分支,然后只推送一个分支。

【讨论】:

  • 这将是一个很酷的解决方案,但不幸的是 github 不允许任何自定义挂钩,只有 webhooks,对于那些我需要另一台服务器来处理它们的人。 :-/ 我正在考虑让分支保持原样(即不将它们合并回主控)但这看起来非常错误,更不用说随着时间的推移增加分支数量了。
  • @MiroKropacek 你没有提到 GitHub ;) 我已经编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2019-09-26
  • 2015-01-10
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多