9

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

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

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

因此,TFS 在构建之前所做的是将当前源代码从 Git 拉到构建服务器上的一个文件夹中,我可以访问该文件夹。

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

我收到以下错误,我终其一生都无法弄清楚它是什么。我已经尝试搜索这个特定的错误,它通常指向在“超级项目”回购被推送之后被推送的子模块提交。但我可以验证在“超级项目”提交和推送完成之前执行所有子模块提交和推送。以下是 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)
$
4

2 回答 2

4

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

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

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

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

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

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

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

一种解决方法是将子模块的 URL 更改为如下所示的内容。'@' 符号与输入空用户名和密码相同。

[submodule "..."]
    path = ...
    url = http://@tfs:8080/...
于 2015-04-23T06:50:39.950 回答