2013-08-26 33 views
5

Tôi đang cố gắng sử dụng libgit2sharp để tải xuống phiên bản trước của tệp. Tôi muốn thư mục làm việc vẫn như cũ, ít nhất được khôi phục về điều kiện trước đó.Làm cách nào để tải xuống phiên bản trước của một tệp bằng libgit2sharp

Cách tiếp cận ban đầu của tôi là thử stash, kiểm tra đường dẫn trên tệp tôi muốn, lưu nó vào một biến chuỗi, sau đó chặn cửa sổ bật lên. Có cách nào để chặn đứng pop không? Tôi không thể tìm thấy nó dễ dàng. Dưới đây là mã tôi có cho đến thời điểm này:

 using (var repo = new Repository(DirectoryPath, null)) 
     { 
      var currentCommit = repo.Head.Tip.Sha; 
      var commit = repo.Commits.Where(c => c.Sha == commitHash).FirstOrDefault(); 
      if (commit == null) 
       return null; 

      var sn = "Stash Name"; 
      var now = new DateTimeOffset(DateTime.Now); 

      var diffCount = repo.Diff.Compare().Count(); 

      if(diffCount > 0) 
       repo.Stashes.Add(new Signature(sn, "[email protected]", now), options: StashModifiers.Default); 

      repo.CheckoutPaths(commit.Sha, new List<string>{ path }, CheckoutModifiers.None, null, null); 
      var fileText = File.ReadAllText(path); 

      repo.CheckoutPaths(currentCommit, new List<string>{path}, CheckoutModifiers.None, null, null); 
      if(diffCount > 0) 
       ; // stash Pop? 
     } 

Nếu có cách tiếp cận dễ dàng hơn sử dụng Stash, điều đó cũng có tác dụng tuyệt vời.

Trả lời

5

Có cách nào để chặn đứng pop không? Tôi không thể dễ dàng tìm thấy nó dễ dàng

Thật không may, Stash pop yêu cầu hợp nhất chưa có sẵn trong libgit2.

Tôi đang cố gắng sử dụng libgit2sharp để tải xuống phiên bản trước đó của tệp. Tôi muốn thư mục làm việc vẫn giữ nguyên như

Bạn có thể đạt được kết quả như vậy bằng cách mở hai phiên bản của cùng một kho lưu trữ, mỗi trường hợp trỏ đến các thư mục làm việc khác nhau. Phương thức khởi tạo Repository chấp nhận thông số RepositoryOptions cho phép bạn thực hiện điều đó.

Đoạn mã sau thể hiện tính năng này. Điều này tạo ra một ví dụ bổ sung (otherRepo) mà bạn có thể sử dụng để truy xuất phiên bản khác của tệp hiện được kiểm tra trong thư mục làm việc chính của bạn.

string repoPath = "path/to/your/repo"; 

// Create a temp folder for a second working directory 
string tempWorkDir = Path.Combine(Path.GetTempPath(), "tmp_wd"); 
Directory.CreateDirectory(newWorkdir); 

// Also create a new index to not alter the main repository 
string tempIndex = Path.Combine(Path.GetTempPath(), "tmp_idx"); 

var opts = new RepositoryOptions 
{ 
    WorkingDirectoryPath = tempWorkDir, 
    IndexPath = tempIndex 
}; 

using (var mainRepo = new Repository(repoPath)) 
using (var otherRepo = new Repository(mainRepo.Info.Path, opts)) 
{ 
    string path = "file.txt"; 

    // Do your stuff with mainrepo 
    mainRepo.CheckoutPaths("HEAD", new[] { path }); 
    var currentVersion = File.ReadAllText(Path.Combine(mainRepo.Info.WorkingDirectory, path)); 

    // Use otherRepo to temporarily checkout previous versions of files 
    // Thank to the passed in RepositoryOptions, this checkout will not 
    // alter the workdir nor the index of the main repository. 
    otherRepo.CheckoutPaths("HEAD~2", new [] { path }); 
    var olderVersion = File.ReadAllText(Path.Combine(otherRepo.Info.WorkingDirectory, path)); 
} 

Bạn có thể lấy một nắm bắt tốt hơn về RepositoryOptions loại này bằng cách nhìn vào các bài kiểm tra trong RepositoryOptionFixture rằng tập thể dục nó.

+0

Cảm ơn. Chỉ cần một lưu ý cho người khác: phương thức 'Repository.CheckoutPaths' sử dụng @nulltoken không tồn tại trong v0.13. Nhưng nó được bao gồm trong chi nhánh vNext. Vì vậy, khi phát hành, (hoặc nếu bạn đang sử dụng vAlpha) điều này sẽ làm việc hoàn hảo. Cho đến lúc đó, bạn sẽ cần phải viết lại các cuộc gọi đó bằng chữ ký hơi khác. – Shlomo

+0

Ngoài ra, cảm ơn công việc của bạn về một gói tuyệt vời. Trợ giúp lớn. – Shlomo

+0

@Shlomo Cảm ơn rất nhiều! :) – nulltoken

Các vấn đề liên quan