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 摘要。