【问题标题】:Can you do a TFS get without needing a workspace?您可以在不需要工作区的情况下进行 TFS 获取吗?
【发布时间】:2014-03-11 12:40:16
【问题描述】:

我正在尝试将我们的构建脚本从使用 SourceSafe 更改为 TFS,而不使用 MsBuild(目前)。

一个小问题是工作区目录被脚本重命名和归档,这使得 TFS 认为它不需要获取任何文件。即使使用 /force 标志,它也只是获取目录而不获取源文件。

我正在使用

TF.exe get "Product/Main/Project1"  /force /recursive /noprompt

为了节省我在脚本中管理工作区或使用中间目录的时间,有谁知道无需工作区即可获取目录和代码的命令?

【问题讨论】:

    标签: tfs


    【解决方案1】:

    没有工作区就无法运行tf get。原因是服务器需要知道服务器路径和本地路径的映射关系。

    如果您要处理大量文件,则不宜:

    1. 每次都创建和删除新工作区
    2. 或者,创建一个新工作区(然后永远不要删除它)

    这样做的原因是每次您执行Get 时,服务器都会跟踪哪些文件、哪些版本下载到了哪个工作区。如果您从不清理这些工作区,那么存储这些信息的表会随着时间的推移而增长。

    此外,如果您一直在创建和删除工作区,服务器必须写入所有这些行,然后在完成后将其删除。这是不必要的。

    您确实应该尝试每次都重复使用相同的工作区。如果这样做,服务器将非常有效地只向您发送自上次下载以来已更改的文件。即使您的构建从一个分支移动到另一个分支,您也可以使用tf get /remap,如果分支共享公用文件,这有时会更有效。

    虽然不能解决你的问题,但可以在没有工作空间的情况下列出文件和下载文件。

    列出文件:

    tf dir $/Product/Main/Project1 /R
    

    下载文件:

    tf view $/Product/Main/Project1/file.cs
    

    使用创意批处理文件,您可以使用FOR 命令将这两者串在一起。不过,我建议您先尝试解决您的工作区问题,因为这就是 TFS 的使用方式。

    【讨论】:

    【解决方案2】:

    工作区是源存储库位置和文件系统位置之间的映射,所以不,不使用工作区是无法逃脱的。但您可以在需要时轻松设置和拆除工作区。

    这是一个简单的 TFS 任务,用于在进行一些文本替换并将它们构建到数据库更新包之前从 TFS 获取我的数据库源文件。您可以轻松地将其转换为当前构建脚本所需的任何语法:

    <Target Name="GetDatabaseSources">
        <!-- clean out the folder before doing the fresh get of the database sources -->
        <Folder.CleanFolder Path="$(DatabaseBuildBaseLocation)" Force="true"/>
    
        <!-- create a workspace for the database source of the product -->
        <CallTarget Targets="CreateDatabaseSourceWorkspace" />
        <!-- get the database sources for the product -->
        <Get TeamFoundationServerUrl="$(TeamFoundationServerUrl)" Workspace="$(DatabaseSourceWorkspaceName)" Recursive="true" Version="$(DatabaseSourceVersion)" Force="true" />
        <!-- delete the workspace -->
        <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" />
    </Target>
    
    <!-- creates and maps a temporary workspace for the database source of the product -->
    <Target Name="CreateDatabaseSourceWorkspace">
        <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" />
        <Exec Command="$(Tf) workspace /new $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt" />
        <Exec Command="$(Tf) workfold /unmap /workspace:$(DatabaseSourceWorkspaceName) $/" />
        <Exec Command="$(Tf) workfold /map /workspace:$(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) $(DatabaseSourceLocation) &quot;$(DatabaseBuildBaseLocation)&quot;"  />
    </Target>
    

    TFS 是您的源存储库,但您没有明确提及您的构建脚本的设计目的。您确实应该将它们迁移到 TFS 构建脚本,然后您可以简化构建,例如您不必担心映射工作区或获取最新的源代码,因为 TFS 会为您完成这些,您只需担心的是任何自定义构建步骤,并可能归档您的构建结果。

    【讨论】:

      【解决方案3】:

      Neno Loje 创建了a small utility that does exactly what you need。如果需要,它还可以从解决方案和项目文件中删除任何源代码控制绑定。

      【讨论】:

        【解决方案4】:

        C# 有 VersionControlServer 库,您可以使用 VersionControlServer.GetItems 调用来获取 TFS Item。如果 ItemType 为 File,则调用 DownloadFile 检索文件。

        【讨论】:

        • 这不是GetItems 所做的。 GetItems 获取有关 TFS 中 Items 的信息。它不会将它们下载到文件系统。
        • 对不起,我省略了信息。您可以使用 GetItems 获取文件系统信息,然后您可以循环项目信息并调用 DownloadFile。
        【解决方案5】:

        我不知道为什么您的构建脚本每次都会删除工作区目录。但是要回答您的问题,我认为您无法在没有工作空间的情况下从 TFS 获取源代码。也许您可以尝试在每次获得之前创建一个工作空间。命令是

        tf.exe workspace /new
        

        【讨论】:

        • 清除工作区以确保没有意外缓存的文件正在使用中。将所有内容复制到不同的工作目录并被清除并不是什么大问题。
        【解决方案6】:

        您可以使用 SourceSafe 轻松做到这一点:将任何版本获取到您想要的任何特定目录。这通常非常方便。很多时候人们会想要这样做。可惜(如果)TFS 不支持它,这是一个缺失的功能,恕我直言。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-19
          • 1970-01-01
          相关资源
          最近更新 更多