2012-04-02 59 views
6

我正在嘗試編寫一個非常輕量級的「構建」腳本,基本上只會從TF(基於Changeset編號)獲取幾個文件。然後我將在SQLCMD中運行這些文件。Team Foundation Server - TF獲取變更集編號

我使用這個:

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

然而,這似乎得到一切,而不僅僅是文件變更#2681。我希望能夠將它指向我的tfs工作區的根目錄,給它一個變更集號,並且只需更新這些少數特定的文件即可。此外,它似乎越來越舊版本(可能是什麼當changeset#2681檢入)當前?

有沒有辦法只得到那些特定的文件,而無需在tf get itemspec中專門調用它們?

編輯:我實際上必須添加/ force選項才能完成任何操作。沒有強制,它甚至不會從服務器上檢索我在本地刪除的文件,這絕對是在變更集中。

感謝, 西爾維亞

回答

2

TFS服務器記錄每個工作空間包含的內容。使用非TFS客戶端命令(無論是tf.exe,團隊資源管理器還是其他客戶端)在本地進行的任何更改都會導致TFS服務器視圖與實際存在的差異。

各種客戶端上的強制選項只是取消所有這些不一致(有效地重置客戶端上的內容以及服務器認爲的內容)。

當您針對指定版本(無論是日期,變更集還是標籤)執行獲取時,您將得到所有一切,包括該時間點,無論此時是否未明確更改。所以得到

tf get /version:D2012-03-30 

將獲得該日期或之前所做的更改。

要僅獲取變更集中包含的項目,您必須自己完成一些工作,使用命令獲取變更集的內容列表並解析該變更集以執行正確的操作(變更集可包含更多不僅僅是更新和添加文件)。

在我看來,如果你想在影響特定TFS文件夾的每個變更集上執行構建,最好使用TFS構建,這完全是爲了做到這一點 - 避免重新發明輪子 - 並專注於構建部分(其他持續構建解決方案可用)。


這將TFS11 當地工作區改變。

例如,處理文件夾的重命名將需要一些非平凡的工作。

+0

感謝您的細節,理查德。看起來我可能需要看看TFS Build。但可能現在我會做這樣的事情: tf.exe獲取$/Database/DBEngine/DatabaseName/sp/ProcedureName.sql /版本:c2681/force – Sylvia 2012-04-02 09:59:58

1

該命令將獲取給定變更的所有來源。默認情況下,它只會獲得它認爲在您的工作區和服務器之間不同的文件。然而,通過使用/ force選項,您可以讓它獲取所有內容,而不管它認爲您的工作空間在哪個狀態(這很慢但具有確保您的工作空間完全與服務器同步的好處)。

所以,只要刪除/力量可能會達到你想要的。

編輯 正如我前面所說,TFS將得到所有的文件,它認爲是從服務器不同。如果您從本地工作區手動刪除文件,TFS不會知道它從本地版本中缺失,因此它不會認爲它需要更新文件。有三種解決方案:

  • 使用/ force確保事物同步,並忍受它很慢。
  • 請勿使用TFS工具(tf.exe,Visual Studio,用於explorer shell的TFS電源工具)以外的任何其他工具修改文件。您不應該只刪除本地硬盤上的文件 - 如果確實需要刪除它們,請在源代碼管理中刪除它們。
  • 在您手動進行更改之前,在TFS中進行脫機。然後,當你上網時,TFS將搜索你所做的所有更改,並將它們添加到你的未決更改中,以便TFS知道它們。
+0

感謝您的快速回答傑森!請參閱編輯問題。 – Sylvia 2012-04-02 09:24:49

4

在Jason's和Richard的帖子中提到的所有內容都是正確的,但我想補充一件可以幫助你的東西。 TFS團隊發佈了一套與VS分開的有用工具,稱爲「Team Foundation Power Tools」。其中一個電動工具是一個額外的命令行工具,稱爲tfpt.exe。 tfpt.exe包含一個「getcs」命令,它相當於「get changeset」,這看起來正是你正在尋找的。

如果你有VS 2010,那麼你可以下載工具here。如果你有一箇舊版本,bing :)搜索應該可以幫助你找到正確版本的工具。如果您想了解更多關於getcs命令的內容,請查看Buck Hodges的帖子here

+0

非常感謝泰勒......我一定會檢查getcs功能,聽起來很有用。 – Sylvia 2012-04-03 11:10:19