.net - Git 子模块在 TFS 构建上失败

标签 .net git tfs tfsbuild

当我尝试使用 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 作为凭证​​缓存,我能够通过以下方式解决此问题:

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

关于.net - Git 子模块在 TFS 构建上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19246151/

相关文章:

c# - 当我尝试使用 visual c# 连接 SQL Server 时收到此错误消息

.net - 如何在不加载图像的情况下可靠地获取 .NET 中的图像尺寸?

git - 在 Android Studio 中更改 Git 根目录

tfs - TFS (VSTS) 中的评论与 checkin 说明

tfs - 如何在小型匹配模式中同时使用 NOT 和 OR 进行过滤?

tfs - TFS 在哪里存储源代码以及如何访问它?

.net - 重新托管的工作流设计器中的 Intellisense

c# - 在 C# 中使用和解析文本文件来初始化基于组件的游戏模型

git - github 是否支持 git wire 协议(protocol) v2?

java - 触发 Git 获取,使用 Jenkins 重置