2013-08-26 5 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 उपयोग v0.13 में मौजूद नहीं है। लेकिन यह vNext शाखा में शामिल है। तो जब जारी किया गया, (या यदि आप vAlpha का उपयोग कर रहे हैं) यह पूरी तरह से काम करेगा। तब तक, आपको थोड़ा अलग हस्ताक्षर का उपयोग करके उन कॉल को दोबारा लिखना होगा। – Shlomo

+0

इसके अलावा, एक महान पैकेज पर आपके काम के लिए धन्यवाद। बड़ी मदद – Shlomo

+0

@ श्लोमो बहुत बहुत धन्यवाद! :) – nulltoken

संबंधित मुद्दे