当我尝试使用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)
$
答案 0 :(得分:4)
我在经过多次试验和错误后修复了类似的问题:原来这是TFS预构建的PowerShell脚本运行时没有用户配置文件的问题,因此GIT无法看到凭据缓存设置构建用户(例如,在C:\Users\theuser\.gitconfig
中设置)。
批处理脚本会遇到同样的问题。
独特的行为是git submodule
调用将完全挂起,并且会使GIT存储库处于非常奇怪的状态(如上面not a tree
错误所述)。
挂起是由于GIT提示输入用户名和密码,但这是一个非交互式会话,所以一切都停止了。
使用wincred
作为凭据缓存,我能够通过以下方式解决此问题:
wincred
,即使它没有用户配置文件:git config --system credential.helper wincred
答案 1 :(得分:0)
原因是'Git Bash'不知道构建帐户的凭据,它应该每次都以交互方式提示它们。实际上,如果构建帐户可以访问所有子模块远程仓库,则只需要为凭证提示提供空的用户名和密码。这在Windows中并不容易,因为凭据管理器不接受空用户名。
解决此问题的一种方法是将子模块的URL更改为如下所示。 “@”符号与提供空用户名和密码相同。
[submodule "..."]
path = ...
url = http://@tfs:8080/...