您可以在不需要工作区的情况下执行TFS get吗?

您可以在不需要工作区的情况下执行TFS get吗?,tfs,Tfs,我正在尝试将构建脚本从使用SourceSafe更改为TFS,而不使用MsBuild(尚未) 一个问题是工作区目录被脚本重命名和存档,这使TFS认为它不需要获取任何文件。即使使用/force标志,它也只获取目录,而不获取源文件 我目前正在使用 TF.exe get "Product/Main/Project1" /force /recursive /noprompt 要保存我在脚本中管理工作区或使用中间目录,是否有人知道可以在不需要工作区的情况下获取目录和代码的命令?我不知道为什么构建脚本每次

我正在尝试将构建脚本从使用SourceSafe更改为TFS,而不使用MsBuild(尚未)

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

我目前正在使用

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

要保存我在脚本中管理工作区或使用中间目录,是否有人知道可以在不需要工作区的情况下获取目录和代码的命令?

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

tf.exe workspace /new

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

下面是一个简单的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会为您这样做,您需要担心的只是任何定制的构建步骤,以及可能会归档构建结果。

如果没有工作区,就不可能运行
tf get
。原因是服务器需要知道服务器路径和本地路径之间的映射

如果要处理大量文件,最好不要:

  • 每次创建并删除一个新工作区
  • 或者,创建一个新的工作区(然后永远不要删除它)
  • 原因是每次执行
    Get
    ,服务器都会跟踪哪些文件、哪些版本下载到了哪个工作区。如果从不清理这些工作区,则存储此信息的表将随着时间的推移而增长

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

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

    虽然这并不能解决您的问题,但可以在没有工作区的情况下列出文件并下载文件

    列出文件:

    tf dir $/Product/Main/Project1 /R
    
    tf view $/Product/Main/Project1/file.cs
    
    下载文件:

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

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

    使用SourceSafe,您可以轻松做到这一点:将任何版本获取到所需的任何特定目录。而且常常非常方便。经常会有这样的情况。羞愧(如果)TFS不支持它,它是一个缺失的功能,imho。

    Neno Loje创建的。若要启动,还可以从解决方案和项目文件中删除任何源代码管理绑定(如果需要)。

    C#具有VersionControlServer库,您可以使用call获取TFS。如果ItemType为File,则调用以检索该文件。

    好的,看来阻力最小的方法是将代码签出到稳定的工作区,然后将代码从那里复制到生成脚本的工作目录中。是否考虑过提交visual studio alm stackexchange方案?此解决方案更干净,因为它只涉及get(不需要文件移动操作):清除工作区以确保没有意外缓存的文件被使用。将所有内容复制到一个不同的工作目录并不是什么大不了的事情,而是被清除。这不是
    GetItems
    所做的
    GetItems
    获取有关TFS中
    项的信息。它不会将它们下载到文件系统。对不起,我遗漏了信息。您可以使用GetItems获取文件系统信息,然后可以循环项目信息并调用DownloadFile。