【问题标题】:How can I get the last commit for a folder using LibGit2Sharp?如何使用 LibGit2Sharp 获取文件夹的最后一次提交?
【发布时间】:2018-12-03 17:39:30
【问题描述】:

我在一个存储库中拥有大量项目。我想确定所有这些项目的波动性,即最后一次提交影响每个项目的时间。我有一个所有项目路径的列表,我试图找到每个项目的最后一次提交。我的代码如下所示:

    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;

最多可能需要八分钟才能完成。据我所知,这些文件夹没有什么特别复杂的……其中的一个样本显示可能有 20 个提交。我怀疑我做错了什么,比如当我需要更具体的东西时加载整个回购图,但我一直无法找到更好的方法。

想法?

【问题讨论】:

    标签: libgit2sharp


    【解决方案1】:

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

    $ git log -1 -C "relativePath"

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

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

    希望这会有所帮助。

    【讨论】:

    • 我已将代码调整为: var commit = repo.Commits.QueryBy(relativePath, filter).Take(1).First().Commit...运行列出的命令relativePath 值立即返回值,但代码仍然需要八分钟。
    • 有没有办法查看发出给 Git 的底层命令,还是我的心智模型有误?
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多