15

我假设这是:

tf.exe get $/project /recursive

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

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

4

6 回答 6

22

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

选项1:根本没有绑定

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

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

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

此时,您现在应该拥有所有文件,如果需要,您还可以绑定 TFS,以便提交更改。或者,您现在可以将内容复制到其他地方并破坏映射/工作区。使用 和 的正确命令行变体tf workfold /unmaptf workspace /delete取消映射您的工作文件夹并删除工作区。

于 2012-08-07T09:45:14.813 回答
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 痕迹。

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

于 2013-01-21T15:47:27.613 回答
4

快速解决方案
在 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 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
于 2015-05-19T06:51:35.737 回答
2

我为主要答案编写了 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'}
}
于 2018-06-04T20:45:08.720 回答
1

TFS 命令行没有“简单”选项 - 它们几乎总是涉及大量输入(例如无法简单地设置默认设置,因此您不必在每个命令)

使 TFS 命令行“简单”的常用方法是编写批处理文件以隐藏每次必须指定的所有细节(服务器 URL 和递归标志等)

但是,TF.exe 确实允许您执行几乎任何操作,因此它是一个非常简单的 tf 调用序列,用于创建临时映射、执行 Get 并再次删除映射。

于 2012-08-01T14:09:12.740 回答
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
于 2016-03-01T04:01:36.140 回答