【发布时间】:2018-06-05 04:45:08
【问题描述】:
我假设:
tf.exe get $/project /recursive
...需要这种奇怪的工作区映射、已知的 TFS 服务器等。
我有什么办法可以做这个最简单的事情:使用 this 凭据集连接到 this TFS 服务器,获取 this 项目并将其放在这里?全部来自命令行。
【问题讨论】:
标签: tfs automation
我假设:
tf.exe get $/project /recursive
...需要这种奇怪的工作区映射、已知的 TFS 服务器等。
我有什么办法可以做这个最简单的事情:使用 this 凭据集连接到 this TFS 服务器,获取 this 项目并将其放在这里?全部来自命令行。
【问题讨论】:
标签: tfs automation
首先,您是否想要一份不再受源代码控制的受控文件的副本(例如 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 答案的基础上,我整理了一个实际脚本,应该可以直接用于那些只想要快速而肮脏的解决方案的人。您应该阅读他的aswer 了解更多信息。
要使用它:
.
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
【讨论】:
tf workspace /new 的有趣之处:它在创建工作空间时自动将服务器根 ($) 映射到当前工作目录。因此,您需要位于不同于您想要将文件放入的目录中,否则tf workfold /map 会抱怨已经存在到此本地文件夹的映射。我的修复:创建新工作区后,我删除了根的映射:%TF_DIR%\tf workfold /unmap $/ /workspace:tmp_batchws
我为主要答案编写了 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 确实允许您执行几乎任何操作,因此它是一个非常简单的 tf 调用序列,用于创建临时映射、执行 Get 并再次删除映射。
【讨论】:
http://johannblais.blogspot.com/2014/07/tfs-equivalent-of-svn-export.html
【讨论】: