I've this method, where I get files from my last commit:
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;
}
I did a look on this question, but I'm newbie with C# and don't understand.
I have this repository:
c:/teste
| - octocat.txt
| - parentoctocat.txt
| - /outros
| | - octocatblue.txt
| | - octored.txt
My last commit have this files modified:
c:/teste
| - /outros
| | - octocatblue.txt <- This modified
| | - octored.txt <- This new
With my method GetFiles
I've all files like in this print. How get only the modified/added/removed files?
How can I get the previous commit and compare getting the tree of difference?
Solution
static void CompareTrees()
{
using (repo)
{
Tree commitTree = repo.Head.Tip.Tree; // Main Tree
Tree parentCommitTree = repo.Head.Tip.Parents.Single().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
}
}
}
Because of how git store data in the file systems, a git commit is a snapshot of all the files contained in the commit. Then the
Tree
object return you the state of all the files of the repository.I think that you must do the diff between the tree of this commit and the tree of the previous one and I think it should be done with the method
Repository.Diff.Compare()