Team Foundation Server - TF获取变更集编号

时间:2012-04-02 09:13:00

标签: tfs

我正在尝试编写一个非常轻量级的“构建”脚本,它基本上只能从TF获取一些文件(基于Changeset编号)。然后我将在SQLCMD中运行这些文件。

我正在使用它:

tf.exe get c:\tfs\  /version:c2681  /force /recursive

然而,这似乎得到了一切,而不仅仅是变更集#2681中的文件。我希望能够将它指向我的tfs工作区的根,给它一个变更集编号,并让它只更新那些少数特定文件。此外,它似乎是越来越老的版本(可能是在更改集#2681签入时的当前版本)?

有没有办法只获取那些特定文件,而无需在tf get itemspec中专门调用它们?

编辑:我实际上必须添加/ force选项才能完成任何操作。如果没有强制,它甚至不会从服务器中检索我在本地删除的文件,这肯定在变更集中。

感谢, 西尔维亚

3 个答案:

答案 0 :(得分:4)

Jason和Richard的帖子中提到的所有内容都是正确的,但我想补充一点可能对你有帮助。 TFS团队提供了一组与VS分开的有用工具,称为“Team Foundation Power Tools”。其中一个Power Tools是一个名为tfpt.exe的附加命令行实用程序。 tfpt.exe包含一个“getcs”命令,相当于“get changeset”,这似乎正是你要找的。

如果你有VS 2010,那么你可以下载工具here。如果你有一个旧版本,bing :)搜索应该可以帮助你找到正确的工具版本。如果您想了解有关getcs命令的更多信息,请查看Buck Hodges的帖子here

答案 1 :(得分:2)

TFS服务器跟踪每个工作区包含 1 的内容。使用非TFS客户端命令(无论是tf.exe,团队资源管理器还是其他客户端)在本地进行的任何更改都将导致TFS服务器视图与实际存在的视图之间存在差异。

各种客户端上的强制选项只会消除所有这些不一致的内容(有效地重置客户端上的内容以及服务器认为的内容)。

当您针对指定版本(无论是日期,变更集还是标签)执行获取时,您可以获得所有内容,包括该时间点,无论是否在此时未进行特别更改。所以得到

tf get /version:D2012-03-30

将在该日期或之前进行更改。

要仅获取变更集中包含的项目,您必须自己完成一些工作,使用命令获取变更集内容的列表并解析该变更集以执行正确的操作(变更集可包括多个只是更新和添加文件 2 )。

在我看来,如果你想在影响特定TFS文件夹的每个变更集上执行构建,那么最好不要使用TFS Build,这完全是为了做到这一点 - 避免重新发明轮子 - 并专注于构建部分(可以使用其他连续构建解决方案)。


1 这将随TFS11 本地工作区而改变。

2 例如。处理文件夹的重命名将需要一些非常重要的工作。

答案 2 :(得分:1)

该命令将获取给定变更集的所有源。默认情况下,它只会获取它认为在您的工作区和服务器之间不同的文件。但是,通过使用/ force选项,无论它认为您的工作区处于何种状态,您都会要求它获取所有内容(速度要慢得多,但确保您的工作区与服务器完全同步)。

所以只需删除/强制就可以达到你想要的效果。

修改 如上所述,tfs将从服务器获取认为不同的所有文件。如果从本地工作区手动删除文件,TFS将不会知道本地版本中缺少该文件,因此它不会认为需要更新该文件。有三种解决方案:

  • 使用/ force确保事物处于同步状态,并且忍受它非常慢。
  • 不要使用TFS工具以外的任何其他工具修改工作区中的文件(tf.exe,Visual Studio,资源管理器shell的TFS电源工具)。您不应该只删除本地硬盘上的文件 - 如果确实需要删除它们,请在源代码管理中删除它们。
  • 在手动进行更改之前,在TFS中脱机。然后,当您上线时,TFS将搜索您所做的所有更改并将其添加到您的待处理更改中,以便TFS了解它们。