Libgit2Sharp:在两个标签之间的所有提交中获取文件

时间:2016-04-06 16:16:27

标签: c# git libgit2 libgit2sharp

我可以在GitBash中这样做: $ git diff --name-only v01...HEAD -- *.sql

给出:

Components/1/Database/Stored Procedures/spDC1.sql Components/1/Database/Stored Procedures/spDC2.sql

我无法看到我将如何在LibGit2Sharp中执行此操作。 有任何想法吗? 感谢

2 个答案:

答案 0 :(得分:2)

以下是我的一个项目中的示例,该项目在两次提交之间获得ICommitLog集合(当前HEAD与主分支):

    // git log HEAD..master --reverse
    public ICommitLog StalkerList {
        get {
            var filter = new CommitFilter { 
                SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Time,
                Since = master,
                Until = head.Tip,             
            };
            return repo.Commits.QueryBy (filter);
        }
    }

在您需要的范围内拥有所有提交的ICommitLog集合之后,您可以遍历每个提交以获取在该提交中生效的文件列表(当然,您需要通过“* .sql”要求添加文件名过滤:

    public String[] FilesToMerge (Commit commit)
    {
        var fileList = new List<String> ();
        foreach (var parent in commit.Parents) {
            foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(parent.Tree, commit.Tree)) {
                fileList.Add (change.Path);
            }
        }
        return fileList.ToArray ();
    }

答案 1 :(得分:1)

我认为SushiHangover对此的回答是非常正确的。只是一些修改/更新。 (P.S.是的,我知道这个问题相对较老,但如果我今天找到它,那么完整的答案会对我有所帮助,所以将其放在这里以备日后窥视)。

此位应为修正评论,但我尚无评论(低代表):

首先,我认为在寿司的例子中,主人和头.Tip是错误的方式。直到从结果中排除提交并排除其祖先。所以,如果你把头放在那里,那么它基本上会排除整个历史树。

所以AFAIK应该更像这样:

 // git log HEAD..master --reverse
public ICommitLog StalkerList {
    get {
        var filter = new CommitFilter { 
            SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Time,
            Since = head.Tip,
            Until = master       
        };
        return repo.Commits.QueryBy (filter);
    }
}

了解你在重要方面给予他们的命令也是非常重要的。如果你只是转换它们,你什么也得不回来。

(另请注意,寿司的原始示例有一个不好的&#39;&#39;在&#34; head.Tip&#34;。

此位是更新:

另外值得注意的是libgit2sharp库最近已更新。取代&#34;自&#34;和&#34;直到&#34;与&#34; IncludeReachableFrom&#34;和&#34; ExcludeReachableFrom&#34;分别

这些名字在你意识到他们对自己所做的事情更加冗长之前并不是特别有用。

例如,Exclude的评论内容如下:

    /// A pointer to a commit object or a list of pointers which will be excluded (along with ancestors) from the enumeration.

所以最新的实现看起来更像是:

using (Repository r = new Repository(@"[repo_location]"))
{
    CommitFilter cf = new CommitFilter
    {
        SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Time,
        ExcludeReachableFrom = r.Branches["master"].Tip,
        IncludeReachableFrom = r.Head.Tip
    };

    var results = r.Commits.QueryBy(cf);

    foreach (var result in results)
    {
        //Process commits here.
    }
}

在LINQPad中测试了它,它似乎工作。因为这是一个快速的选秀,可能会错过一些东西。如果是这样,请告诉我。

需要注意的事项:master和Head实际上是Repository的属性,我看不到来自旧示例中的任何地方,但它可能只是与旧版本的版本差异。