【问题标题】:Command line "get latest" from TFS without mapping workspaces and such从 TFS 命令行“获取最新”而不映射工作区等
【发布时间】:2018-06-05 04:45:08
【问题描述】:

我假设:

tf.exe get $/project /recursive

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

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

【问题讨论】:

标签: tfs automation


【解决方案1】:

首先,您是否想要一份不再受源代码控制的受控文件的副本(例如 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 的正确命令行变体将取消映射您的工作文件夹并删除工作区。

【讨论】:

  • 非常感谢!但是OMGWTF?让整个尝试自动化 TFS VC 的事情见鬼去吧。
  • 我不反对......似乎有很多人喜欢它......但他们中似乎很少有人使用除了可怕的 VSS 之外的任何其他东西......
【解决方案2】:

从 TFS 中干净地导出任何文件夹?终于找到了我认为的绝妙解决方案。

我现在不打算为你完全研究这个,但打算以后有时间的时候用这个替换我非常混乱的构建服务器工作区同步脚本。

解决方案:

使用 Microsoft 的 Git-TF 将源代码保存到磁盘,而无需设置工作区或其他任何东西。我试过这个命令,效果很好。认为它适用于 TFS 2010 和 2012。据我所知,不会有任何绑定或工作区或任何会在以后引起问题的东西。我认为您只需要安装 GIT 和 GIT-TF。

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

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

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

【讨论】:

  • "C:\MyGetTFUnzipLocation\git-tf.cmd" 克隆myteamfoundationserver/tfs $/MySolution001/MyProject001/SomeFolder/
  • 因此,如果我从 c:\temp\ 运行上述代码,代码将被下载到 c:\temp\SomeFolder 并在那里有一个可以删除的 c:\temp\SomeFolder\.git 文件夹。
  • 这是我搜索 63 小时后得到的最完美的解决方案。它对我有用,没有任何错误
【解决方案3】:

快速解决方案
在 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

【讨论】:

  • tf workspace /new 的有趣之处:它在创建工作空间时自动将服务器根 ($) 映射到当前工作目录。因此,您需要位于不同于您想要将文件放入的目录中,否则tf workfold /map 会抱怨已经存在到此本地文件夹的映射。我的修复:创建新工作区后,我删除了根的映射:%TF_DIR%\tf workfold /unmap $/ /workspace:tmp_batchws
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-21
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2013-10-28
        • 2021-04-23
        相关资源
        最近更新 更多