命令行从TFS“获取最新”而不映射工作空间等

时间:2012-08-01 13:54:52

标签: tfs automation

我认为这是:

tf.exe get $/project /recursive

...需要这个奇怪的工作空间映射,已知的TFS服务器等。

我有什么方法可以做这个最简单的事情:使用凭据连接到 TFS服务器,获取 this <的最新源代码/ em>项目并将其放在这里?全部来自命令行。

6 个答案:

答案 0 :(得分:21)

首先,您是否希望获得不再受源代码控制的受控文件的副本(例如SVN导出),或者您是否仍希望使用这些文件和TFS?

选项1:完全没有绑定

如果您只是想要一份最新文件的副本而且没有“绑定”到TFS,那么您将不得不自己做一些工作。不要使用凭证([/login:username,[password]]参数到许多命令行方法)。

  1. 使用TF命令获取文件列表:tf dir "$/YourSolution" /Recursive > files.txt
  2. 使用一些聪明的批处理文件(或使用脚本语言)处理files.txt
  3. 读取以$/开头的行,这是目录,在目的地中创建目录(删除前三个字符,最后一个字符,冒号)。
  4. 阅读下一行(直到空白或文件末尾),每个行代表在步骤3中发现的目录中的文件。假设您将文件放在变量%file%和目录%dir%中,然后发出以下命令(对于该目录中的每个文件):
  5. tf view "$/%DIR%/%FILE%" "/output:Your-Target-Path/%DIR%/%FILE%"

    或者如果您对目前的目录感到满意:

    tf view "$/%DIR%/%FILE%" "/output:%DIR%/%FILE%"

    注意,您需要输出部分中的%DIR%/%FILE%,否则所有文件都将被转储到同一目录中。

    注意:这可能是非常高的带宽和缓慢的操作!

    选项2:临时映射

    1. 创建一个临时工作空间:tf workspace /new /collection:<URL_TO_SERVER> /permission:Private(注意,这将提示,有一个无提示选项,但确定工作空间的名称仍为练习)
    2. 制作文件目录,例如LOCALDIR
    3. 为您的文件夹创建映射:tf workfold /map "$/SERVER_DIR" "LOCALDIR"
    4. 进入LOCALDIR
    5. 获取文件tf get . /Recursive
    6. 此时您现在应该拥有所有文件,如果您还希望与TFS绑定,那么您可以提交更改。或者,您现在可以将内容复制到其他位置并中断映射/工作区。使用tf workfold /unmaptf workspace /delete的正确命令行变体将取消映射工作文件夹并删除工作区。

答案 1 :(得分:9)

从TFS干净地导出任何文件夹?终于找到了一个很棒的解决方案。

我现在不打算为你完全研究这个问题,但是当我有空的时候打算用这个替换我非常凌乱的构建服务器工作区同步脚本。

解决方案:

使用Microsoft的Git-TF将源代码发送到磁盘,而无需设置工作区或任何内容。我尝试了这个命令,它工作得非常好。认为它适用于TFS 2010和2012.根据我的理解,将不会有任何绑定或工作空间或任何遗留下来会导致问题。我认为您需要安装的只是GIT和GIT-TF。

http://www.microsoft.com/en-us/download/details.aspx?id=30474

您实际上将文件放入GIT存储库,这根本不是问题。您将在导出的文件夹中找到一个名为.git的(隐藏?)文件夹,我想您可以删除它以消除任何GIT痕迹。

如果某人实现了这一点,这应该很容易,请确认它是否按预期工作。

答案 2 :(得分:2)

快速解决方案
在Ray Hayes 选项2 答案的基础上,我整理了一个实际的脚本,应该直接用于那些只想要快速和肮脏的解决方案的人。您应该阅读他的aswer了解更多信息。

使用它:

  • 将四个变量设置为您的工作环境
  • 记住你的 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 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

答案 3 :(得分:1)

没有&#34; easy&#34;关于TFS命令行的选项 - 它们几乎总是涉及大量的输入(例如,不能简单地设置默认设置,因此您不必在每个命令上指定集合URL)

制作TFS命令行的常用方法&#34;简单&#34;是编写批处理文件来隐藏每次必须指定的所有细节(服务器URL和递归标记等)

TF.exe确实允许你做几乎任何事情,所以它是一个非常直接的tf调用序列来创建一个临时映射,做一个Get并删除映射。

答案 4 :(得分:1)

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-encoded-source-control-path

  • tfs-server是TFS服务器主机名
  • port是TFS端口(通常是 8080)
  • Collection是您的团队项目集合的名称
  • TeamProject是您团队项目的名称
  • 团队是团队的名称
  • url-encoded-source-control-path是URL编码的源 控制路径(例如,$ / Project1 / Main / Sources / Folder / SubFolder变为%24%2FProject1%2FMain%2FSources%2FFolder%2FSubFolder

答案 5 :(得分:0)

我为主要答案写了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'}
}