当我尝试使用 TFS 和 Git 进行构建时,存在一个限制,即 TFS 的 git 提供程序尚不支持子模块。有点痛苦,但管他呢,我能够告诉 TFS 在编译之前运行一个批处理文件。我用它来调用手动 git 脚本来更新我的“ super ”项目中的所有子模块。
这个批处理文件运行的命令很简单: git 子模块更新 --init --recursive
在我将子模块源迁移到 TFS 之前,这工作得很好,但现在 TFS 构建失败了,因为上面的 git 模块脚本不再有效。
因此,TFS 在构建之前所做的是将当前源从 Git pull 入构建服务器上的一个文件夹中,我可以访问该文件夹。
如果我打开 Git Bash 到这个文件夹并运行以下命令: git子模块初始化 git 子模块更新
我收到以下错误,但我终究无法弄清楚它是什么。我已经尝试搜索此特定错误,该错误通常指向在推送“ super 项目” repo 协议(protocol)后推送的子模块提交。但是我可以验证所有子模块提交和推送都是在“ super 项目”提交和推送完成之前执行的。以下是 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 提示输入要使用的用户名和密码,但这是一个非交互式 session ,所以一切都停止了。
使用 wincred
作为凭证缓存,我能够通过以下方式解决此问题:
- 以构建用户身份登录构建机器。
- 通过命令行访问 GIT 服务器并输入所需的凭据。
- 打开 Windows 凭据管理器并检查缓存的凭据是否在“通用凭据”部分可见。
- 在提升的命令提示符下,强制 GIT 默认使用
wincred
,即使它没有用户配置文件:git config --system credential.helper wincred
< - 从 TFS 重新运行构建:成功了。
关于.net - Git 子模块在 TFS 构建上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19246151/