我假设这是:
tf.exe get $/project /recursive
需要这个奇怪的工作区映射,已知的TFS服务器等等。
有没有什么方法可以做这件最简单的事情:使用这套凭据连接到这个TFS服务器,获取该项目的最新源代码,并将其放在这里?全部来自命令行。
首先,您想要一份不再受源代码管理的受控文件的副本(例如SVN导出),还是仍然希望使用这些文件和TFS?
选项1:完全没有约束力
如果你只是想要一份最新文件的副本,而不想"绑定"到TFS,你就必须自己做一些工作。保留凭据(许多命令行方法的[/login:username,[password]]
参数)。
- 使用
TF
命令获取文件列表:tf dir "$/YourSolution" /Recursive > files.txt
- 使用一些巧妙的批处理文件(或使用脚本语言)处理
files.txt
: - 读取以
$/
开头的行,这就是目录,在目标中创建目录(删除前三个字符和最后一个冒号) - 读取下一行(直到为空或文件结束),每一行都表示在步骤3中发现的目录中的一个文件。假设文件位于变量
%file%
和目录%dir%
中,则发出以下命令(针对该目录中的每个文件):
tf view "$/%DIR%/%FILE%" "/output:Your-Target-Path/%DIR%/%FILE%"
或者如果您对当前目录作为目标感到满意:
tf view "$/%DIR%/%FILE%" "/output:%DIR%/%FILE%"
注意,输出部分需要%DIR%/%FILE%
,否则所有文件都将转储到同一目录中。
注意:这可能是一个非常高的带宽和缓慢的操作!
选项2:临时映射
- 创建一个临时工作空间:
tf workspace /new /collection:<URL_TO_SERVER> /permission:Private
(注意,这将提示,没有提示选项,但确定工作空间的名称是一个练习) - 为文件创建一个目录,例如
LOCALDIR
- 为文件夹创建映射:
tf workfold /map "$/SERVER_DIR" "LOCALDIR"
- 进入
LOCALDIR
- 获取文件
tf get . /Recursive
在这一点上,您现在应该拥有所有的文件,如果您想要的话,您还可以与TFS绑定,这样您就可以提交更改。或者,您现在可以将内容复制到其他位置并破坏映射/工作区。使用tf workfold /unmap
和tf workspace /delete
的正确命令行变体将取消映射工作文件夹并删除工作空间。
是否从TFS中干净地导出任何文件夹?我认为终于找到了一个绝妙的解决方案。
我现在不打算为你彻底研究这个,但打算在以后有时间的时候用这个替换我那令人难以置信的混乱的构建服务器工作区同步脚本。
解决方案:
使用微软的GitTF将源代码放到磁盘上,而无需设置工作区或其他任何东西。我试过这个命令,效果很好。认为它适用于TFS 2010和2012。据我所知,不会有绑定或工作区或任何会在以后引起问题的东西。我认为你需要安装的只是GIT和GIT-TF。
http://www.microsoft.com/en-us/download/details.aspx?id=30474
实际上,您将把文件放入GIT存储库,这根本不是问题。你会在导出的文件夹中得到一个名为.git的(隐藏?)文件夹,我想你可以简单地删除它来消除任何git的痕迹。
如果有人实现了这一点,这应该很容易,请确认它按预期工作。
快速解决方案
在Ray Hayes选项2答案的基础上,我编写了一个实际的脚本,应该直接用于那些只想要快速而肮脏的解决方案的人。你应该阅读他的简历了解更多信息。
使用:
- 为您的工作环境设置四个变量
- 记住你的tf.exe可能不在我拥有它的同一目录中,尤其是如果你在未来读到这篇文章:)
SET COLLECTION_URL="http://localhost:8080/tfs/<collection>"
SET SERVER_DIR="$/<REMOTE_SOLUTION_DIR>"
SET LOCAL_DIR="X:<YourLocalDir>"
SET TF_DIR="C:Program FilesMicrosoft Visual Studio 10.0Common7IDE"
%TF_DIR%tf workspace /new /collection:%COLLECTION_URL% /permission:Private /noprompt tmp_batchws
%TF_DIR%tf workfold /map %SERVER_DIR% %LOCAL_DIR%
cd /d %LOCAL_DIR%
%TF_DIR%tf get . /Recursive
%TF_DIR%tf workspace /delete tmp_batchws /noprompt
我为主要答案编写了powershell
$base = "f:whereyouwantthefilestogo"
foreach($l in get-content D:outputfromTFdir.txt)
{
if($l -match '^$.*:$')
{
$repopath = $l.trim(':')
write-host 'base path'
$basepath = "$base$($l.Substring(2,$l.Length -3) -replace '/','')"
if((Test-Path $basepath) -eq $false)
{
write-host 'making directory'
New-Item -ItemType directory -Path $basepath
}
continue;
}
elseif($l -match '^$')
{
write-host 'sub folder'
$subfolderpath = "$basepath$($l.trim('$'))"
if((Test-Path $subfolderpath) -eq $false)
{
write-host 'making directory'
New-Item -ItemType directory -Path $subfolderpath
}
continue;
}
elseif($l -match '.*..*')
{
write-host 'get file'
$filename = "$basepath$l"
write-host $filename
$repofile = "$repopath/$l"
tf view "$repofile" "/output:$filename" /collection:http://tfsserver
}
else{write-host 'blank line'}
}
TFS命令行没有"简单"选项-它们几乎总是需要大量的键入(例如不能简单地设置默认值,这样就不必在每个命令上指定集合URL)
使TFS命令行"简单"的常用方法是编写批处理文件,以隐藏每次必须指定的所有细节(服务器URL和递归标志等)
不过,TF.exe几乎允许您执行任何操作,因此创建临时映射、执行Get和然后再次删除映射是一个非常直接的TF调用序列。
http://johannblais.blogspot.com/2014/07/tfs-equivalent-of-svn-export.html
http://tfs-server:port/tfs/Collection/TeamProject/Team/_api/_versioncontrol/itemContentZipped?repositoryId=&path=url编码的源代码管理路径
- tfs-server是tfs服务器主机名
- port是TFS端口(通常8080)
- 集合是团队项目集合的名称
- TeamProject是您的团队项目的名称
- Team是团队的名称
- url编码的源代码管理路径是url编码的源控制路径(例如,$/Project1/Main/Sources/Folder/SubFolder变为%24%2FProject1%2FMain%2FSources%2FFolder%2FSubFolder