Получить файлы, измененные/добавленные/удаленные из фиксации в LibGit2Sharp

У меня есть этот метод, где я получаю файлы из моего последнего коммита:

static void GetFiles(Tree t, String dir = "")
{
    foreach (TreeEntry treeEntry in t)
    {
        if (treeEntry.TargetType == TreeEntryTargetType.Tree)
        {
            Tree tr = repo.Lookup<Tree>(treeEntry.Target.Sha);
            GetFiles(tr, dir + "/" + treeEntry.Name);
        }
        else
        {
            string caminho = dir + "/" + treeEntry.Path;
            arquivos.Add(caminho);
        }

    }
    return;
}

Я посмотрел на этот вопрос, но я новичок в С# и не понимаю.

У меня есть этот репозиторий:

c:/teste
| - octocat.txt
| - parentoctocat.txt
| - /outros
| | - octocatblue.txt
| | - octored.txt

Мой последний коммит изменил эти файлы:

c:/teste
| - /outros
| | - octocatblue.txt <- This modified
| | - octored.txt <- This new

С моим методом GetFiles меня есть все файлы, как в этом принте. Как получить только измененные/добавленные/удаленные файлы?

Program execution


Как я могу получить предыдущий коммит и сравнить полученное дерево различий?


Решение

static void CompareTrees()
{
    using (repo)
    {
        Tree commitTree = repo.Head.Tip.Tree; // Main Tree
        Tree parentCommitTree = repo.Head.Tip.Parents.First().Tree; // Secondary Tree

        var patch = repo.Diff.Compare<Patch>(parentCommitTree, commitTree); // Difference

        foreach (var ptc in patch)
        {
            Console.WriteLine(ptc.Status +" -> "+ptc.Path); // Status -> File Path
        }
    }
}

Solution

Ответ 1

Из-за того, что git хранит данные в файловых системах, фиксация git - это моментальный снимок всех файлов, содержащихся в коммите. Затем объект Tree возвращает вам состояние всех файлов репозитория.

Я думаю, что вы должны сделать разницу между деревом этого коммита и деревом предыдущего, и я думаю, что это должно быть сделано с помощью метода Repository.Diff.Compare()