Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Libgit2Sharp:在两个标记之间的所有提交中获取文件_C#_Git_Libgit2_Libgit2sharp - Fatal编程技术网

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

C# Libgit2Sharp:在两个标记之间的所有提交中获取文件,c#,git,libgit2,libgit2sharp,C#,Git,Libgit2,Libgit2sharp,我可以在GitBash中这样做: $git diff--name only v01…HEAD--*.sql 其中: Components/1/数据库/存储过程/spDC1.sql 组件/1/数据库/存储过程/spDC2.sql 我不知道如何在LibGit2Sharp中实现这一点。 有什么想法吗? 感谢以下是我的一个项目中的一个示例,该项目在两次提交(当前头与主分支)之间获得了一个ICommitLog集合: 一旦您拥有了所需范围内所有提交的ICommitLog集合,您就可以循环执行每个提交,以获得

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

其中:

Components/1/数据库/存储过程/spDC1.sql
组件/1/数据库/存储过程/spDC2.sql

我不知道如何在LibGit2Sharp中实现这一点。 有什么想法吗?
感谢

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

一旦您拥有了所需范围内所有提交的
ICommitLog
集合,您就可以循环执行每个提交,以获得在该提交中生效的文件列表(当然,您需要通过“*.sql”要求添加文件名过滤):

公共字符串[]文件合并(提交)
{
var fileList=新列表();
foreach(commit.Parents中的var parent){
foreach(TreeEntryChanges repo.Diff.Compare(parent.Tree,commit.Tree)中的更改){
fileList.Add(change.Path);
}
}
返回fileList.ToArray();
}

我认为Sushingover对此的回答非常正确。只是一些修改/更新。(是的,我知道这个问题相对来说比较老,但如果我今天找到了一个完整的答案,我会有所帮助,所以在这里放一个供以后参考)

这一点应该是修改意见,但我还不能评论(低代表):

首先,我认为在寿司的例子中,师傅和掌门人是错误的。直到从结果中排除提交并排除其祖先。如果你把head.Tip放进去,它基本上会排除整个历史树

那么,好吧,应该这样读:

 // 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);
    }
}
同样重要的是要意识到,你在事情上给他们的命令。如果你把它们换过来,你就什么也得不到了

(还要注意,Sushi最初的例子在“head.Tip”之后有一个坏的“,”

这是更新:

还值得注意的是,libgit2sharp库最近已经更新。将“自”和“直到”分别替换为“IncludeReachableFrom”和“ExcludeReachableFrom”

在你意识到这些名字只是对他们正在做的事情更加冗长之前,它们并没有特别的帮助

例如,“排除”的注释如下:

    /// 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实际上是存储库的属性,在旧示例中我看不到来自任何地方的属性,但这可能只是与旧版本的版本差异。

感谢您解释ExcludeReachableFrom和IncludeReachableFrom-事实上,我的属性颠倒了,不明白为什么翻转它们会起作用-直到我读了你的帖子。很棒的帖子!@Colin感谢你的反馈,对标点符号的编辑也非常感谢。
    /// 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.
    }
}