Xcode机器人: git子模块未初始化。

6

我正在尝试使用OSX服务器设置Xcode机器人。在配置git存储库并创建机器人之后,我运行了整合操作。但是它失败了,因为只部分检出了存储库。更具体地说:虽然有6个子模块被配置,但只有3个被初始化和检出。

didi@mac:/Library/Server/Xcode/Data/BotRuns/Cache/c5fda8f4-4d25-4d25-c18a-eb0b16a06692/source$ git submodule status
+c6e8420aec4147641fb1ca12d9f1d31bdd804e77 libs/asi-http-request (v1.7-320-gc6e8420)
-ae64a38766b42f236bb94f0e661cddb829f9ac43 libs/kraken
-7da02b323636bbaa0bbbf5b4eb229fcc07b1e14a libs/route-me
 152f9ee5576e710705a49032253d7d5af5366f9c libs/routing (152f9ee)
 347aaf74fe0c6388785095efdbf6397851514b7f libs/rtlabel (1.0-32-g347aaf7)
-562cf6b1c879f03546f5184e012cea15c4f159db libs/skmaps

(- 表示未初始化)

查看机器人日志,它似乎只是忽略了子模块初始化部分缺失的子模块:

...
Checking connectivity... done
Submodule 'libs/asi-http-request' (https://github.com/BikeCityGuide/asi-http-request.git) registered for path 'libs/asi-http-request'
Submodule 'libs/routing' (ssh://mac_ci@rooty.bikecityguide.org/var/repos/librouting.git) registered for path 'libs/routing'
Submodule 'libs/rtlabel' (https://github.com/BikeCityGuide/RTLabel.git) registered for path 'libs/rtlabel'
Cloning into 'libs/asi-http-request'...
...

这里或任何其他地方都没有错误信息。在日志中也没有提到任何缺失子模块(例如“kraken”名称)。

手动检查时(克隆、子模块初始化、子模块更新),所有的子模块都被初始化了。

.gitmodules看起来像这样:

$ cat .gitmodules 
[submodule "libs/asi-http-request"]
    path = libs/asi-http-request
    url = https://github.com/BikeCityGuide/asi-http-request.git
[submodule "libs/rtlabel"]
    path = libs/rtlabel
    url = https://github.com/BikeCityGuide/RTLabel.git
[submodule "libs/routing"]
    path = libs/routing
    url = ../librouting.git
[submodule "libs/kraken"]
    path = libs/kraken
    url = ../kraken_ios.git
[submodule "libs/route-me"]
    path = libs/route-me
    url = ../route-me.git
[submodule "libs/skmaps"]
    path = libs/skmaps
    url = ../skmaps.git

基础仓库以及使用相对URL引用的4个子模块仓库都需要ssh身份验证。在OSX服务器上设置的用户可以访问它们所有。机器人日志中没有尝试拉取缺失子模块的迹象。 我可以手动修复本地仓库,但是我不想在新项目和新增加的子模块中再次出现同样的问题。 git版本1.8.4.2 我已经没有更多的想法了。

机器人的日志中没有尝试拉取缺失子模块的痕迹。这些日志中有任何错误信息吗? - VonC
唯一的错误信息是由于缺少源文件而导致构建失败的错误信息。 - didi_X8
我猜手动执行 git submodule update --init --recursive 可以工作? - VonC
yes <filling min chars> - didi_X8
3个回答

13

在 Xcode 6.1.1 和 OS X Server 4.0 上,看起来他们已经解决了分离 HEAD 的子模块问题,但仍然存在一些错误。我的一个项目有一个子模块被 Xcode Server 完全忽略,导致应用程序构建失败:


$ git submodule
 8a88bc41c9dc0f57c921d82bc4e7b93e1c4cbf7a InAppStore (heads/master)
 e4203f9f61d2546868c1274da5c7a0c56b87a737 Libraries (heads/master)  <--- IGNORED
 01902f255e6c3d90f0db41cb62dd2934098b98dd MixpanelTracker (heads/master)
 e2bee59accd817d50dff881a42c9e9afe307226f XLFacility (1.4.1-5-ge2bee59)

对我而言解决方法是添加一个预集成脚本触发器,如下所示:

cd "$XCS_SOURCE_DIR/{YOUR_APP_REPO_NAME_WITHOUT_DOT_GIT_SUFFIX}"
git submodule update --init --recursive

就在这时,尽管有一些有关结账不干净或类似问题的非致命性警告,但情况正在逐渐好转。当我将机器人配置更改为将“清洁”设置为“始终”时,这些警告消失了。


1
我的问题是子模块没有更新到正确的提交。这个解决方案完美地解决了它。我不明白为什么苹果不能正确地使用子模块,但至少脚本给了我们一个解决方法。 - phatmann
cd ${XCS_PRIMARY_REPO_DIR} 将切换到 git 根目录。它足够通用,可用于所有 CI 脚本。 - RobLabs

1
在Xcode 9服务器中,如果工作区中的任何一个Xcode项目都没有引用子模块中的文件,则子模块不会被初始化。
例如,当您从非代码子模块中包括头文件时,而不是将其添加到项目中,因此将其添加到“headers search paths”(c / c ++)中,可能会发生这种情况。
一个可能的解决方法是将子模块中至少一个文件添加到Xcode项目中。甚至可以是Readme.md文件。 这比使用自定义脚本检出子模块更容易,因为它依赖于Xcode Server存储您的GIT凭据。

0

自 Xcode 6 起,已经修复了分离的 HEAD 问题。有关当前问题的解决方法,请参阅 Pol 的答案。 - phatmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接