How do I get a previous version of a file with libgit2sharp

眉间皱痕 提交于 2019-12-10 14:49:08

问题


I'm trying to use libgit2sharp to get a previous version of a file. I would prefer the working directory to remain as is, at the very least restored to previous condition.

My initial approach was to try to stash, checkout path on the file I want, save that to a string variable, then stash pop. Is there a way to stash pop? I can't find it easily. Here's the code I have so far:

        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, "x@y.com", 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?
        }

If there's an easier approach than using Stash, that would work great also.


回答1:


Is there a way to stash pop? I can't find it easily

Unfortunately, Stash pop requires merging which isn't available yet in libgit2.

I'm trying to use libgit2sharp to get a previous version of a file. I would prefer the working directory to remain as is

You may achieve such result by opening two instances of the same repository, each of them pointing to different working directories. The Repository constructor accepts a RepositoryOptions parameter which should allow you to do just that.

The following piece of code demonstrates this feature. This creates an additional instance (otherRepo) that you can use to retrieve a different version of the file currently checked out in your main working directory.

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

You can get a better grasp of this RepositoryOptions type by taking a look at the tests in RepositoryOptionFixture that exercise it.



来源:https://stackoverflow.com/questions/18450342/how-do-i-get-a-previous-version-of-a-file-with-libgit2sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!