libgit2 / libgit2/libgit2sharp

repo.Commits.QueryBy(<path>) doesn't return entire history of changing commits

未关闭
#1,401 3 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
C#
星标
3.5k
派生
925
PR 合并指标
30 天内没有已合并 PR

描述

I was playing around with using CommitLog.QueryBy() to obtain the history of a specific file, and I am not clear if I'm using the feature correctly, but not getting the output I would expect.

Specifically, in a sample repo with 5 commits where each commit changes the same file, .QueryBy() appears to omit the commit that is merging and changing the file.

Is it possible this is by design, and the merge change in Iteration 4 is being purposefully omitted, or might this be a bug?

Here's the output of my sample program:

History of sample.txt has 4 entries:
 - 742d4c5d1fa8c8b4f3fd6894580cb33e7a3ab4e0: Iteration 5
 - 0cbfdb9a0f98ef3e62ba9e8f2d5dd6ef9bd755f6: Iteration 2
 - 59947c86d20f45b6f19dfd52dcbc4c4b23fc4d16: Iteration 3
 - 020323b5bc36f931442343df6aa0557e8d20581f: Iteration 1
Commit history has 5 entries:
 - 742d4c5d1fa8c8b4f3fd6894580cb33e7a3ab4e0: Iteration 5
 - d096877e0d40c0a002e73c308a50d94d6ffbcb67: Iteration 4
 - 0cbfdb9a0f98ef3e62ba9e8f2d5dd6ef9bd755f6: Iteration 2
 - 59947c86d20f45b6f19dfd52dcbc4c4b23fc4d16: Iteration 3
 - 020323b5bc36f931442343df6aa0557e8d20581f: Iteration 1

Here's the code that i'm running against a sample repo (see below):

using LibGit2Sharp;
using System;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        // This program is compiled against:
        // - LibGit2Sharp v0.23.0
        // - Native binaries v1.0.129
        static void Main(string[] args)
        {
            var repo = new Repository(Repository.Discover(Environment.CurrentDirectory));

            var filePath = "sample.txt";

            // Look at the history of sample.txt
            var fileHist = repo.Commits.QueryBy(filePath).Select(x => x.Commit).ToList();
            Console.WriteLine("History of {0} has {1} entries:", filePath, fileHist.Count);
            foreach (var commit in fileHist)
                Console.WriteLine(" - {0}: {1}", commit.Sha, commit.MessageShort);

            // Look at the entire history
            var fullHist = repo.Commits.ToList();
            Console.WriteLine("Commit history has {1} entries:", filePath, fullHist.Count);
            foreach (var commit in fullHist)
                Console.WriteLine(" - {0}: {1}", commit.Sha, commit.MessageShort);
        }
    }
}

Here's the script to create a sample git repo that has a diamond pattern of commits around a file:

@REM create a git repo with a single file
git init
echo 1 > sample.txt
git add sample.txt
git commit -m "Iteration 1"

@REM create a branch and make a change
git checkout -b "branch"
echo 2 >> sample.txt
git commit -a -m "Iteration 2"

@REM make a change on the master
git checkout master
echo 3 >> sample.txt
git commit -a -m "Iteration 3"

@REM merge branch into master and overwrite conflict
git merge branch
echo 1 > sample.txt
echo 2 >> sample.txt
echo 3 >> sample.txt
echo 4 >> sample.txt
git commit -a -m "Iteration 4"

@REM one last change for good measure
echo 5 >> sample.txt
git commit -a -m "Iteration 5"

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先复现示例仓库,并针对完整的 repo.Commits 历史运行 issue 中所示的 repo.Commits.QueryBy(filePath) 代码。检查 CommitLog.QueryBy 入口点,并比较合并提交的处理方式。完成标准是确定 Iteration 4 的合并提交是否应当出现,并修正行为或记录预期结果。

由索引模型根据 Issue 内容生成。

评估

技术栈
csharp, git
领域
tooling
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。