当我尝试使用 TFS 和 Git 进行构建时,存在一个限制,即 TFS 的 git 提供程序尚不支持子模块。有点痛苦,但到底是什么,我可以告诉 TFS 在编译之前运行批处理文件。我用它来调用手动 git 脚本来更新我的“超级”项目中的所有子模块。
该批处理文件运行的命令很简单:
git 子模块更新 --init --recursive
在我将子模块源迁移到 TFS 之前,这工作得很好,但是现在 TFS 构建失败了,因为上面的 git 模块脚本不再工作。
因此,TFS 在构建之前所做的是将当前源代码从 Git 提取到构建服务器上我有权访问的文件夹中。
如果我打开此文件夹的 Git Bash 并运行以下命令:
git 子模块初始化
git 子模块更新
我收到以下错误,并且我无法弄清楚它是什么。我尝试搜索这个特定的错误,该错误通常指向在推送“超级项目”存储库后推送的子模块提交。但我可以验证所有子模块提交和推送都是在“超级项目”提交和推送完成之前执行的。以下是 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)
$
经过多次试验和错误后,我修复了类似的问题:事实证明,这是在没有用户配置文件的情况下运行的 TFS 预构建 PowerShell 脚本的问题,因此 GIT 无法看到构建用户的凭据缓存设置(例如,如设置C:\Users\theuser\.gitconfig
).
批处理脚本也会遇到同样的问题。
独特的行为是git submodule
调用会完全挂起,并且会使 GIT 存储库处于一种非常奇怪的状态(如not a tree
上面的错误)。
挂起是由于 GIT 提示输入要使用的用户名和密码,但这是一个非交互式会话,因此一切都会停止。
Using wincred
作为凭证缓存,我可以通过以下方式解决此问题:
- 以构建用户身份登录到构建机器。
- 通过命令行访问 GIT 服务器并输入所需的凭据。
- 打开 Windows 凭据管理器并检查缓存的凭据在“通用凭据”部分中是否可见。
- 在提升的命令提示符下,强制 GIT 使用
wincred
默认情况下,即使它没有用户配置文件:git config --system credential.helper wincred
- 从 TFS 重新运行构建:有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)