TFS Build上的Git子模块失败

时间:2013-10-08 11:10:15

标签: .net git tfs tfsbuild tfs2013

当我尝试使用Git使用TFS构建时,TFS的git提供程序尚不支持子模块存在限制。有点痛苦,但是,我能告诉TFS在编译之前运行批处理文件。我用它来调用手动git脚本来更新我的“超级”项目中的所有子模块。

此批处理文件运行的命令很简单: git submodule update --init --recursive

在将子模块源迁移到TFS之前,这工作得很好,但是现在TFS构建失败了,因为上面的git模块脚本不再有效。

那么,TFS在构建之前所做的是将当前源从Git拉到构建服务器上的一个文件夹,我有权访问它。

如果我将Git Bash打开到此文件夹并运行以下命令: git submodule init git submodule update

我收到以下错误,我无法为我的生活做些什么。我已经尝试搜索这个特定的错误,这个错误通常指向在推送“超级项目”repo之后推送的子模块提交。但我可以验证所有子模块提交&推送是在“超级项目”提交之前执行的。推完了。这是TFS git命令的输出:

james@TFS /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development)
$ git submodule init

james@TFS /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development)
$ git submodule update
Username for 'http://tfs:8080': james
Password for 'http://james@TFS:8080': <password>
From http://TFS:8080/TFS/Technique/_git/Technique%20Library
 * branch            HEAD       -> FETCH_HEAD
fatal: reference is not a tree: 33106ea146d470159e327c1b2d623d14f522cdd4
Unable to checkout '33106ea146d470159e327c1b2d623d14f522cdd4' in submodule path 'calc-engine'

james@TFS /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development)
$

2 个答案:

答案 0 :(得分:4)

我在经过多次试验和错误后修复了类似的问题:原来这是TFS预构建的PowerShell脚本运行时没有用户配置文件的问题,因此GIT无法看到凭据缓存设置构建用户(例如,在C:\Users\theuser\.gitconfig中设置)。

批处理脚本会遇到同样的问题。

独特的行为是git submodule调用将完全挂起,并且会使GIT存储库处于非常奇怪的状态(如上面not a tree错误所述)。

挂起是由于GIT提示输入用户名和密码,但这是一个非交互式会话,所以一切都停止了。

使用wincred作为凭据缓存,我能够通过以下方式解决此问题:

  1. 以构建用户身份登录构建计算机。
  2. 通过命令行访问GIT服务器并输入所需的凭据。
  3. 打开Windows凭据管理器,检查“通用凭据”部分中是否显示了缓存的凭据。
  4. 在提升的命令提示符下,强制GIT默认使用wincred,即使它没有用户配置文件:git config --system credential.helper wincred
  5. 从TFS重新运行构建:这有效。

答案 1 :(得分:0)

原因是'Git Bash'不知道构建帐户的凭据,它应该每次都以交互方式提示它们。实际上,如果构建帐户可以访问所有子模块远程仓库,则只需要为凭证提示提供空的用户名和密码。这在Windows中并不容易,因为凭据管理器不接受空用户名。

解决此问题的一种方法是将子模块的URL更改为如下所示。 “@”符号与提供空用户名和密码相同。

[submodule "..."]
    path = ...
    url = http://@tfs:8080/...