2013-08-26 15 views
5

Próbuję użyć libgit2sharp, aby uzyskać poprzednią wersję pliku. Wolałabym, aby katalog roboczy pozostał taki, jaki jest, przynajmniej przywrócony do poprzedniego stanu.Jak uzyskać poprzednią wersję pliku z libgit2sharp

Moje początkowe podejście polegało na próbie przechowania, ścieżce do kasy na żądanym pliku, zapisaniu jej na zmiennej łańcuchowej, a następnie ukrywaniu popu. Czy istnieje sposób, aby ukryć pop? Nie mogę tego łatwo znaleźć. Oto kod, który mam do tej pory:

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

Jeśli jest łatwiejsze podejście niż przy użyciu Stash, to również byłoby świetne.

Odpowiedz

5

Czy istnieje sposób na ukrywanie popu? Nie mogę go łatwo znaleźć

Niestety, Stash pop wymaga scalenia, które nie jest jeszcze dostępne w libgit2.

Próbuję użyć libgit2sharp, aby uzyskać poprzednią wersję pliku. Wolałabym, aby katalog roboczy pozostał taki, jaki jest, aby uzyskać taki wynik, otwierając dwa wystąpienia tego samego repozytorium, z których każdy wskazuje różne katalogi robocze. Konstruktor Repository akceptuje parametr RepositoryOptions, który powinien umożliwiać właśnie to.

Poniższy fragment kodu demonstruje tę funkcję. Tworzy to dodatkową instancję (otherRepo), której można użyć do pobrania innej wersji pliku aktualnie wyrejestrowanego w głównym katalogu roboczym.

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

można uzyskać lepsze zrozumienie tego typu RepositoryOptions przez przyjrzeniu testów w RepositoryOptionFixture które ją wykonują.

+0

Dzięki. Po prostu notatka dla kogoś innego: metoda 'Repository.CheckoutPaths' używana przez @nulltoken nie istnieje w wersji v.13. Ale jest zawarty w gałęzi vNext. Tak więc po wydaniu (lub jeśli używasz vAlpha), to będzie działać idealnie. Do tego czasu będziesz musiał ponownie napisać te połączenia, używając nieco innego podpisu. – Shlomo

+0

Dziękuję również za pracę nad świetnym pakietem. Duża pomoc. – Shlomo

+0

@Shlomo Wielkie dzięki! :) – nulltoken

Powiązane problemy