C# Libgit2Sharp:在两个标记之间的所有提交中获取文件
我可以在GitBash中这样做: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集合,您就可以循环执行每个提交,以获得
$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.
}
}