2013-08-26 75 views
5

我試圖用libgit2sharp獲取文件的以前版本。我寧願工作目錄保持原樣,至少恢復到以前的狀態。我如何獲得一個文件的以前版本libgit2sharp

我最初的做法是試圖藏匿,結賬路徑上我想要的文件,是保存到一個字符串變量,然後藏匿流行。有沒有辦法隱藏流行音樂?我找不到它。這裏是我到目前爲止的代碼:

 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? 
     } 

如果有比使用存儲更容易的方法,那也可以。

回答

5

有沒有一種方法來隱藏彈出?我無法輕鬆找到它

不幸的是,Stash pop需要合併,這在libgit2中尚不可用。

我正在嘗試使用libgit2sharp獲取文件的以前版本。我寧願工作目錄保持原樣

您可以通過打開同一個存儲庫的兩個實例來獲得這樣的結果,每個實例都指向不同的工作目錄。 Repository構造函數接受一個RepositoryOptions參數,它應該允許你這樣做。

下面一段代碼演示了此功能。這會創建一個額外的實例(otherRepo),您可以使用該實例來檢索當前在主工作目錄中籤出的不同版本的文件。

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)); 
} 

您可以通過採取RepositoryOptionFixture是行使它來看看測試得到這個RepositoryOptions類型的更好的把握。

+0

謝謝。 只是爲別人說明:@nulltoken使用的方法'Repository.CheckoutPaths'在v0.13中不存在。但它包含在vNext分支中。所以當發佈時(或者如果你使用vAlpha),這將會很好地工作。在此之前,您需要使用稍微不同的簽名來重寫這些呼叫。 – Shlomo

+0

此外,感謝您在一個偉大的包裝上的工作。大的幫助。 – Shlomo

+0

@Shlomo非常感謝! :) – nulltoken

相關問題