Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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与git日志路径的等价物是什么?_C#_Git_Libgit2_Libgit2sharp - Fatal编程技术网

C# LibGit2Sharp与git日志路径的等价物是什么?

C# LibGit2Sharp与git日志路径的等价物是什么?,c#,git,libgit2,libgit2sharp,C#,Git,Libgit2,Libgit2sharp,如何获取包含特定文件的提交列表,即LibGit2Sharp的git日志路径的等价物 它是否还没有实现,或者我缺少了什么方法?来自C库。。。首先不包括git log) 然而,LibGit2Sharp有自己的git日志函数: 它涉及,但筛选器似乎不按路径进行筛选(如“”中所述)。 因此,目前它似乎还没有实现。我正在使用LibGit2Sharp将相同的功能引入到我的应用程序中 我在下面编写了代码,它将列出包含该文件的所有提交。GitCommit类不包括在内,但它只是一个属性集合 我的意图是在文件发生更

如何获取包含特定文件的提交列表,即
LibGit2Sharp
git日志路径的等价物

它是否还没有实现,或者我缺少了什么方法?

来自C库。。。首先不包括
git log

然而,LibGit2Sharp有自己的
git日志
函数:
它涉及,但筛选器似乎不按路径进行筛选(如“”中所述)。

因此,目前它似乎还没有实现。

我正在使用LibGit2Sharp将相同的功能引入到我的应用程序中

我在下面编写了代码,它将列出包含该文件的所有提交。GitCommit类不包括在内,但它只是一个属性集合

我的意图是在文件发生更改的地方使用仅代码列表提交,类似于SVN日志,但我还没有编写该部分

请注意,代码还没有优化,这只是我最初的尝试,但我希望它会有用

//
///加载文件的历史记录
/// 
///文件路径
///版本历史记录列表
公共列表加载历史记录(字符串文件路径)
{
LibGit2Sharp.Repository repo=新存储库(this.pathtrepo);
string path=filePath.Replace(this.pathToRepo.Replace(System.IO.path.directoryseportorchar+“.git”,string.Empty),string.Empty);
列表=新列表();
foreach(在repo.Head.Commits中提交)
{
if(this.TreeContainsFile(commit.Tree,path)&&list.Count(x=>x.Date==commit.Author.When)==0)
{
添加(新的GitCommit(){Author=commit.Author.Name,Date=commit.Author.When,Message=commit.MessageShort}作为版本历史);
}
}
退货清单;
}
/// 
///检查GIT树以查看文件是否存在
/// 
///GIT树
///文件名
///如果文件存在,则为true
私有布尔树内容文件(树树,字符串文件名)
{
if(tree.Any(x=>x.Path==filename))
{
返回true;
}
其他的
{
foreach(Tree.Where中的树分支(x=>x.Type==GitObjectType.Tree)。选择(x=>x.Target作为树))
{
if(此.TreeContainsFile(分支,文件名))
{
返回true;
}
}
}
返回false;
}

每次更改树/blob时,它都会得到新的id哈希。 您只需与父提交树/blob项哈希进行比较:

var commits = repository.Commits
   .Where(c => c.Parents.Count() == 1 && c.Tree["file"] != null &&
      (c.Parents.FirstOrDefault().Tree["file"] == null ||
         c.Tree["file"].Target.Id !=
         c.Parents.FirstOrDefault().Tree["file"].Target.Id));

与dmck的答案非常相似,但更符合最新情况

private bool TreeContainsFile(Tree tree, string filePath)
{
    //filePath is the relative path of your file to the root directory
    if (tree.Any(x => x.Path == filePath))
    {
        return true;
    }

    return tree.Where(x => x.GetType() == typeof (TreeEntry))
        .Select(x => x.Target)
        .OfType<Tree>()
        .Any(branch => TreeContainsFile(branch, filePath));
}
private bool树内容文件(树树、字符串文件路径)
{
//filePath是文件到根目录的相对路径
if(tree.Any(x=>x.Path==filePath))
{
返回true;
}
返回tree.Where(x=>x.GetType()==typeof(TreeEntry))
.选择(x=>x.Target)
第()类
.Any(branch=>TreeContainsFile(branch,filePath));
}

我想你指的是C库。有没有办法手动遍历结构?或者我必须获得提交列表,然后排除那些不涉及我感兴趣的文件的提交吗?@Toobarways正如dmck的回答所示,你必须获得提交并自己进行筛选。出于好奇,什么是
IVersionHistory
?@Toobarways我的应用程序与SVN和Git repos一起工作,所以我有一个文件版本历史记录的界面。我建议你使用基于差异的方法,这应该更快。您可以浏览一下利用这种方法的提案。我注意到,在前面,我不确定出现在
libgit2sharp/Follow test/Program.cs
中的
repo.History
出现在。。。我想我最好把它拉下来,然后把它擦干净,谢谢!dll必须与托管代码匹配。我建议从vNext分支开始。另外,也许我们应该把这个讨论从SO中去掉?:-)LibGit2Sharp问题跟踪器中有一个专门处理这个主题的工具。哇!非常感谢。这是我遇到的最好的机制。
private bool TreeContainsFile(Tree tree, string filePath)
{
    //filePath is the relative path of your file to the root directory
    if (tree.Any(x => x.Path == filePath))
    {
        return true;
    }

    return tree.Where(x => x.GetType() == typeof (TreeEntry))
        .Select(x => x.Target)
        .OfType<Tree>()
        .Any(branch => TreeContainsFile(branch, filePath));
}