代码之家  ›  专栏  ›  技术社区  ›  Chris B. Behrens

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

  •  5
  • Chris B. Behrens  · 技术社区  · 6 年前

    我在一个存储库中有很多项目。我想确定所有这些项目的波动性,也就是说,上一次提交时影响了每个项目。我有一个所有项目路径的列表,我正试图找到每个路径的最后一个提交。我的代码如下:

        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;
    

    可能需要8分钟才能完成。据我所知,这些文件夹并没有什么特别复杂的地方……它们的一个示例显示可能有20个提交。我怀疑我做错了什么,比如在需要更具体的东西时加载整个回购图,但我还没有找到更好的方法。

    思想?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ayberk    6 年前

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

    $git log-1-C“相对路径”

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

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

    希望这有帮助。