5

我正在尝试使用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, "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?
        }

如果有比使用 Stash 更简单的方法,那也很好用。

4

1 回答 1

6

有没有办法储存流行音乐?我不容易找到

不幸的是,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));
}

RepositoryOptions您可以通过查看RepositoryOptionFixture中的测试来更好地掌握这种类型。

于 2013-08-26T21:10:44.587 回答