Xcode 机器人不会将 git 子模块更新为指定的提交

Xcode Bots do not update git submodules to specified commit

我的 Xcode 机器人正在使用我的存储库子模块的过时版本。

尽管子模块在父应用程序的提交历史记录中更新为新版本,它仍构建旧的子模块代码。

  1. 父仓库使用子模块 v1.0。
  2. 父仓库将子模块更新到 v2.0 并将子项目提交到 github。
  3. "on commit" Xcode 机器人 运行 自动进行新提交。
  4. 父应用已上传到 TestFlight。
  5. TestFlight 构建包含正确的 v2.0 子模块提交(最后一次提交到父存储库)。
  6. 但是 TestFlight 构建包含过时的子模块 v1.0 代码。

尽管在子模块和本地构建中存在 "fixed",但当我的错误在 TestFlight 构建中重现时,我以为我要疯了。

事实证明Xcode机器人没有正确地拉取指定的子模块提交。

从 Xcode 6 开始,Xcode 不保证机器人将 repo 的子模块更新到指定的提交。

您需要在 Xcode 机器人构建之前手动更新子模块:

git submodule update --init --recursive

为了使这更容易,我已将 updateGitSubmodules 添加到 cavejohnson Xcode 机器人脚本工具。将以下内容添加到您的 Before Integration 运行 脚本阶段以自动更新子模块:

集成前 > 运行 脚本:

#!/bin/bash
PATH=/Library/Frameworks/Python.framework/Versions/3.4/bin:$PATH

cavejohnson updateGitSubmodules

最后,我们 opened an ticket 探索如何在上游修复此行为。

这个问题的更简单的解决方案不需要服务器为您的 git 遥控器提供凭据 - 将其添加为您的机器人的预集成脚本:

#!/bin/sh
# Enumerates each submodule to check out the desired commit.
# Needed because Xcode bots for some reason prefers to check out
# the branch head, which may result in the wrong commit.
cd "$XCS_PRIMARY_REPO_DIR"
git submodule foreach --recursive 'git checkout $sha1'

它递归地枚举你的子模块并检查父仓库期望的提交。