我假设这是:
tf.exe get $/project /recursive
...需要这种奇怪的工作空间映射、已知的 TFS 服务器等。
有什么办法可以做这个最简单的事情:使用这组凭据连接到这个TFS 服务器,获取这个项目的最新源代码并将它放在这里?全部来自命令行。
我假设这是:
tf.exe get $/project /recursive
...需要这种奇怪的工作空间映射、已知的 TFS 服务器等。
有什么办法可以做这个最简单的事情:使用这组凭据连接到这个TFS 服务器,获取这个项目的最新源代码并将它放在这里?全部来自命令行。
首先,您是否想要一份不再受源代码控制(例如 SVN 导出)的受控文件的副本,或者您仍然希望使用这些文件和 TFS?
如果您只是想要一份最新文件的副本并且没有“绑定”到 TFS,那么您将不得不自己做一些工作。撇开凭据([/login:username,[password]]
许多命令行方法的参数)。
TF
命令获取文件列表:tf dir "$/YourSolution" /Recursive > files.txt
files.txt
使用一些巧妙的批处理文件(或使用脚本语言)进行处理:$/
,在目标中创建目录(删除前三个字符和最后一个字符,一个冒号)。%file%
和目录中有文件%dir%
,然后发出以下命令(对于该目录中的每个文件): tf view "$/%DIR%/%FILE%" "/output:Your-Target-Path/%DIR%/%FILE%"
或者如果您对当前目录作为目标感到满意:
tf view "$/%DIR%/%FILE%" "/output:%DIR%/%FILE%"
请注意,您需要%DIR%/%FILE%
在输出部分中添加,否则所有文件都将转储到同一目录中。
注意:这可能是一个非常高的带宽和缓慢的操作!
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 干净地导出任何文件夹?终于找到了我认为的绝妙解决方案。
我现在不打算为您完全研究这个,但打算稍后在有时间的时候用这个替换我非常混乱的构建服务器工作区同步脚本。
解决方案:
使用 Microsoft 的 Git-TF 将源代码保存到磁盘,而无需设置工作区或其他任何东西。我试过这个命令,效果很好。认为它将适用于 TFS 2010 和 2012。据我所知,不会有任何绑定或工作区或任何会在以后引起问题的遗留物。我认为您只需要安装 GIT 和 GIT-TF。
http://www.microsoft.com/en-us/download/details.aspx?id=30474
您实际上会将文件放入 GIT 存储库,这根本不是问题。您将在导出的文件夹中获得一个名为 .git 的(隐藏?)文件夹,我想您可以简单地删除它以消除任何 GIT 痕迹。
如果有人实现了这一点,这应该很容易,请确认它按预期工作。
快速解决方案
在 Ray Hayes选项 2答案的基础上,我整理了一个实际脚本,应该可以直接供那些只想要快速而肮脏的解决方案的人使用。您应该阅读他的回答以获取更多信息。
要使用它:
.
SET COLLECTION_URL="http://localhost:8080/tfs/<collection>"
SET SERVER_DIR="$/<REMOTE_SOLUTION_DIR>"
SET LOCAL_DIR="X:\<YourLocalDir>"
SET TF_DIR="C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE"
%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 命令行没有“简单”选项 - 它们几乎总是涉及大量输入(例如无法简单地设置默认设置,因此您不必在每个命令)
使 TFS 命令行“简单”的常用方法是编写批处理文件以隐藏每次必须指定的所有细节(服务器 URL 和递归标志等)
但是,TF.exe 确实允许您执行几乎任何操作,因此它是一个非常简单的 tf 调用序列,用于创建临时映射、执行 Get 并再次删除映射。
http://johannblais.blogspot.com/2014/07/tfs-equivalent-of-svn-export.html