如何使用LibGit2Sharp获取文件夹的最后提交?

时间:2018-12-03 17:39:30

标签: libgit2sharp

我在单个存储库中拥有大量项目。我想确定所有这些项目的波动性,即最后一次提交何时影响每个项目。我已经获得了所有项目路径的列表,并且正在尝试查找每个项目的最后一个提交。我的代码如下:

    public CommitInfo GetLastCommit(string path)
    {
        // resolve any \..\ and pathing weirdness
        path = Path.GetDirectoryName(Path.GetFullPath(path));

        var relativePath = path.Substring(BaseRepoPath.Length + 1).Replace("\\", "/");

        if (!CommitCache.TryGetValue(relativePath, out CommitInfo result))
        {
            var options = new RepositoryOptions()
            {
                WorkingDirectoryPath = BaseRepoPath
            };

            using (var repo = new Repository(BaseRepoPath, options))
            {
                var filter = new CommitFilter()
                {
                    IncludeReachableFrom = BranchName
                };

                var commit =  repo.Commits.QueryBy(relativePath, filter).First().Commit;

                result = new CommitInfo
                {
                    When = commit.Author.When.DateTime,
                    Who = commit.Author.Name,
                    Message = commit.Message,
                    Files = commit.Tree.Select(x => x.Name).ToList()
                };

                repo.Dispose();
            }

            CommitCache.Add(relativePath, result);
        }

        return result;
    }

可行,但是实际检索到提交的行:

var commit =  repo.Commits.QueryBy(relativePath, filter).First().Commit;

最多可能需要八分钟才能完成。据我所知,这些文件夹没有什么特别复杂的...其中一个样本显示了二十次提交。我怀疑我在做一些错误的事情,例如当我需要更具体的信息时加载整个回购图,但是我一直无法找出更好的方法。

有想法吗?

1 个答案:

答案 0 :(得分:2)

您的要求是通过lib2gitsharp软件包生成以下git命令。

  

$ git log -1 -C“ relativePath”

您可以借助lib2gitsharp中的Take(numberOfCommits)扩展名来限制提交的大小。请尝试将Take(1)放在First()之前,如下所示;

var commit =  repo.Commits.QueryBy(relativePath, filter).Take(1).First().Commit;

希望这会有所帮助。