2012-05-03 16 views
11

Tôi muốn lấy mã nguồn của một dự án tại thời điểm cụ thể (changeset). Vì vậy, tôi cần tải xuống toàn bộ thư mục. Tôi muốn làm điều đó cho các thời điểm khác nhau và xử lý một không gian làm việc khác nhau không phải là rất thuận tiện.Cách lấy phiên bản thư mục cụ thể từ tfs mà không cần tạo không gian làm việc?

Tôi biết về TFS Get Specific Version into separate folder (có không gian làm việc) và Need command to get a file from TFS without a workspace (một tệp).

Có một số giải pháp cho toàn bộ thư mục mà không cần tạo không gian làm việc mới không?

Chỉnh sửa Tôi đã tìm thấy câu trả lời được chấp nhận quá tham vọng. Tôi cần một cái gì đó đơn giản hơn.

Giả định:

  • Tôi có thể truy cập TFS từ Visual Studio trên máy tính của tôi
  • Tôi muốn nhận được ChangeSetNumber changeset từ thư mục DesiredFolder trong dự án TFS tProj

Tôi chạy lô sau từ thư mục đích trong Dấu nhắc lệnh Visual Studio

set workspace_name=TemporaryWorkspace%username% 
set changeset= ChangeSetNumber     
tf workspace -new %workspace_name% -noprompt 
tf workfold -map $/tProj . -workspace:%workspace_name% 
tf get $/tProj/DesiredFolder -version:C%changeset% -recursive -noprompt 
tf workfold -unmap . -workspace:%workspace_name% 
tf workspace -delete %workspace_name% -noprompt 

Cần xác nhận loại bỏ liên kết kiểm soát nguồn khi bắt đầu giải pháp đã tải xuống.

+0

Bạn có thể giải thích/giải thích "để làm điều đó cho các thời điểm khác nhau" không? – Nock

+0

@Nockawa: Có thể có các thay đổi khác nhau. Tôi chỉ cần nghiên cứu xem liệu tại sao nó lại hoạt động theo những cách khác thường. – IvanH

+0

Bạn có thể giải thích tại sao thao tác với không gian làm việc không thuận tiện không? Nếu bạn có một không gian làm việc được thiết lập và bạn muốn đồng bộ toàn bộ dự án với các thay đổi 150, bạn có thể thực hiện điều này bằng một lệnh: "tf get/version: 150". –

Trả lời

13

tôi sử dụng cú pháp này cho không gian làm việc tạm thời:

tf workspace -new %JOB_NAME%;%user% -noprompt -server:http://%host%:8080/tfs/%project% -login:%user%,%password% 
tf workfold -map $/Release/MilestoneX.X . -workspace:%JOB_NAME% -server:http://%host%:8080/tfs/%project% -login:%user%,%password% 
tf get . -version:L%TFS_LABEL% -recursive -noprompt -login:%user%,%password% 
tf workfold -unmap . -workspace:%JOB_NAME% -login:%user%,%password% 
tf workspace -delete %JOB_NAME%;%user% -noprompt -server:http://%host%:8080/tfs/%project% -login:%user%,%password% 
4

Tôi nghĩ bạn nên tạo một Vùng làm việc tạm thời để truy xuất nội dung bạn muốn, sau đó xóa Vùng làm việc và giữ các mục cục bộ.

Không gian làm việc trong TFS là chế độ xem cục bộ những gì trên máy chủ, cho một không gian làm việc mà bạn chọn thư mục nào bạn muốn truy xuất cục bộ và nơi bạn sẽ lưu trữ thư mục/tệp.

Không giống SourceSafe, bạn đang không bị ràng buộc với chỉ một không gian làm việc, bạn có thể có bao nhiêu tùy thích trên một máy tính nhất định.

Vì vậy, tôi khuyên bạn nên tạo không gian làm việc chuyên dụng cho hoạt động bạn muốn thực hiện và loại bỏ nó khi bạn đánh giá nó phù hợp.

Sử dụng lệnh TF.exe workspace để tạo/xóa Vùng làm việc khỏi Shell. Sau đó, TF.exe get để truy xuất tệp.

+0

Tôi sẽ cho nó một cơ hội. Nhưng tôi muốn có một cái gì đó như xem nhưng đối với một thư mục. – IvanH

6

Tôi đã phát hiện ra rằng bạn có thể làm điều này thông qua các api HTTP TFS lộ. Các "chữ ký" cho URL như sau:

http(s)://{server}:{port}/tfs/{collectionName}/{teamProjectName}/_api/_versioncontrol/itemContentZipped?version={versionSpec}&path={escapedPathToFolder} 

Vì vậy, nếu bạn có một dự án có tên là "MyProject" trong DefaultCollection, và muốn nhận được nội dung của một thư mục có tên "MyFeature":

http://MyTfsServer:8080/tfs/DefaultCollection/MyProject/_api/_versioncontrol/itemContentZipped?version=C1001&path=%24%2FMyProject%2FMyFeature 

Tôi nghĩ rằng "phiên bản" có thể là bất kỳ thông số phiên bản nào, được ghi lại trong tài liệu API TFS. Ví dụ của tôi là yêu cầu phiên bản thay đổi thiết lập 1001.Tôi đã sử dụng .NET API để có được một phiên bản cụ thể, khá đơn giản, nhưng chậm vì nó chỉ có thể nhận được một tập tin tại một thời điểm. Tôi đang cố gắng để tìm ra nếu chức năng tương tự này được tiếp xúc thông qua NET API. Bởi vì tải các tập tin theo cách này là nhanh hơn nhiều so với nhận được một tập tin duy nhất tại một thời điểm.

Tôi đã triển khai phương thức này làm phương thức tiện ích mở rộng trên Microsoft.TeamFoundation.VersionControl.Client.Item. Điều này trả về luồng có chứa tệp zip. Tôi đã sử dụng điều này như là một phần của một nhiệm vụ MSBuild tùy chỉnh, sau đó lưu nội dung của luồng này vào một vị trí tệp.

public static class TfsExtensions 
{ 

    const String ItemContentZippedFormat = "/_api/_versioncontrol/itemContentZipped?version={0}&path={1}&__v=3"; 

    public static Stream DownloadVersion(this Item folder, VersionSpec version) 
    { 
     if (folder.ItemType != ItemType.Folder) 
      throw new ArgumentException("Item must be a folder", "folder"); 


     var vcs = folder.VersionControlServer; 

     var collectionName = vcs.TeamProjectCollection.CatalogNode.Resource.DisplayName; 

     var baseUri = folder.VersionControlServer.TeamFoundationServer.Uri; 
     if (!baseUri.LocalPath.EndsWith(collectionName, StringComparison.OrdinalIgnoreCase)) 
      baseUri = new Uri(baseUri, baseUri.LocalPath + "/" + collectionName); 


     var apiPath = String.Format(ItemContentZippedFormat, version.DisplayString, WebUtility.UrlEncode(folder.ServerItem)); 
     var downloadUri = new Uri(baseUri, baseUri.LocalPath + apiPath); 

     var req = WebRequest.Create(downloadUri); 
     req.Credentials = CredentialCache.DefaultCredentials; 
     var response = req.GetResponse(); 
     return response.GetResponseStream(); 
    } 
} 
+0

Bạn có liên lạc với máy chủ tfs bằng WebClient hoặc cách khác không? Bạn có thêm mã mẫu không? – IvanH

+0

@IvanH Tôi sử dụng System.Net.WebRequest để tải nội dung. Đã bao gồm một ví dụ. – MarkPflug

+0

Lưu ý rằng việc sử dụng loại cơ chế này sẽ không tận dụng được các proxy tải xuống, nếu bạn có cấu hình đó. Nếu không, đây là một cơ chế rất tốt đẹp thực sự. –

1

Bạn có thể sử dụng tf view để nhận tệp cụ thể mà không cần tạo không gian làm việc.

Retrieves a specific version of a file to a temporary folder on your computer and displays it. 

tf vc view [/collection:TeamProjectCollectionUrl] 
     [/console] [/recursive] [/output:localfile] 
     [/shelveset:shelvesetname[;owner]] [/noprompt] itemspec 
     [/version:versionspec] [/login:username,[password]] 

Versionspec: 
Date/Time   D"any .Net Framework-supported format" 
        or any of the date formats of the local machine 
Changeset number Cnnnnnn 
Label    Llabelname 
Latest version T 
Workspace   Wworkspacename;workspaceowner 
+1

Cách tiếp cận này chỉ hoạt động với các tệp riêng lẻ, không phải với các thư mục. Chạy lệnh khi bạn có nó ở đây sẽ tạo ra một tệp lớn (có tên là C: \ path \ to \ localdirectory) chứa tất cả các tệp trong thư mục nối với nhau. – JamesQMurphy

+0

@JamesQMurphy, cảm ơn! Tôi không thể tin rằng đó là cách hoạt động. Tôi đã kết thúc việc giải quyết điều này với một hàm powershell bằng cách sử dụng kết hợp của 'dir' và' view'. Bạn có thể thấy trong [gist] này (https://gist.github.com/clintcparker/ee92d2e6faa45614e2c41afbd33884ed). – clintcparker