C# 如何使用libgit2sharp更改/删除/添加文件?

C# 如何使用libgit2sharp更改/删除/添加文件?,c#,git,libgit2,libgit2sharp,C#,Git,Libgit2,Libgit2sharp,我有两个约会——从和到。我必须找到存储库中在日期差之间更改的文件,并将其列出。这是一个相关的问题,它可以区分不同的树 因此,假设您正在尝试复制: git log --reverse --since "11/10/2015" --until="11/15/2015" --format="%cD %s" 一旦有了提交列表,ICommitLog,通过所有回购协议的commits、过滤的分支列表等。。您可以通过Linq进行过滤 因此,请创建您的提交列表: var repo = new Reposito

我有两个约会——从和到。我必须找到存储库中在日期差之间更改的文件,并将其列出。这是一个相关的问题,它可以区分不同的树

因此,假设您正在尝试复制:

git log --reverse --since "11/10/2015" --until="11/15/2015" --format="%cD %s"
一旦有了提交列表,
ICommitLog
,通过所有回购协议的
commits
、过滤的分支列表等。。您可以通过Linq进行过滤

因此,请创建您的提交列表:

var repo = new Repository ("/Users/sushi/code/playscript/mono");
var filter = new CommitFilter {
    SortBy = CommitSortStrategies.Time | CommitSortStrategies.Reverse,
};
var commits = repo.Commits.QueryBy(filter);
现在使用
ICommitLog提交
对象,在提交对象上应用
Linq
过滤器。在本例中,我使用提交人的日期并过滤从今天起2到7天的提交,但请记住还有一个
作者
日期:

var since = new DateTimeOffset(DateTime.Now.AddDays(-7));
var until = new DateTimeOffset(DateTime.Now.AddDays(-2));
var filteredCommitLog = commitLog.Where(c => c.Committer.When > since && c.Committer.When < until);
foreach (Commit commit in filteredCommitLog)
{
    Console.WriteLine("{0} : {1}", commit.Committer.When.ToLocalTime(), commit.MessageShort);
}
更新:

11/15/2015 5:32:36 AM -08:00 : [runtime] Fix Thread.CurrentThread in non-root appdomains by setting the tls slot in start_wrapper, otherwise Thread.CurrentThread would create a new Thread object so there would be two. Fixes #35828.
11/15/2015 12:00:30 AM -08:00 : Fix a warning.
....
11/10/2015 6:41:09 AM -08:00 : Merge pull request #2214 from kumpera/fix_enum_get_get_hashcode
11/10/2015 6:07:50 AM -08:00 : [Mono.Posix] Update incorrect test
 git log --name-status --since "11/10/2015" --until="11/15/2015" --format=""
Modified    :   acceptance-tests/Makefile.am
Modified    :   acceptance-tests/SUBMODULES.json
Modified    :   external/referencesource
Modified    :   mcs/class/Facades/Makefile
Modified    :   mcs/class/Mono.Cairo/Mono.Cairo/Context.cs
Modified    :   mcs/class/Mono.Security/Mono.Security.Interface/CertificateValidationHelper.cs
Modified    :   mcs/class/Mono.Security/Mono.Security.Interface/MonoTlsProvider.cs
Modified    :   mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/ActionBlockTest.cs
Modified    :   mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/BatchBlockTest.cs
Modified    :   mcs/class/System.Threading.Tasks.Data
我完全错过了这个答案的一部分,修改过的文件列表…:-/(需要更多的咖啡)

变成:

    var since = new DateTimeOffset(DateTime.Now.AddDays(-7));
    var until = new DateTimeOffset(DateTime.Now.AddDays(-2));
    var filteredCommitLog = commitLog.Where(c => c.Committer.When > since && c.Committer.When < until);
    foreach (Commit commit in filteredCommitLog)
    {
        Console.WriteLine("{0} : {1}", commit.Committer.When.ToLocalTime(), commit.MessageShort);
        foreach (var parent in commit.Parents) {
            foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(parent.Tree, commit.Tree)) {
                Console.WriteLine ("\t{0} :\t{1}", change.Status, change.OldPath);
            }
        }
    }
foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(filteredCommitLog.First().Tree, filteredCommitLog.Last().Tree)) {
    Console.WriteLine ("\t{0}\t:\t{1}", change.Status, change.OldPath);
}
要跳过日志并仅获取筛选提交列表中的文件列表:

11/15/2015 5:32:36 AM -08:00 : [runtime] Fix Thread.CurrentThread in non-root appdomains by setting the tls slot in start_wrapper, otherwise Thread.CurrentThread would create a new Thread object so there would be two. Fixes #35828.
11/15/2015 12:00:30 AM -08:00 : Fix a warning.
....
11/10/2015 6:41:09 AM -08:00 : Merge pull request #2214 from kumpera/fix_enum_get_get_hashcode
11/10/2015 6:07:50 AM -08:00 : [Mono.Posix] Update incorrect test
 git log --name-status --since "11/10/2015" --until="11/15/2015" --format=""
Modified    :   acceptance-tests/Makefile.am
Modified    :   acceptance-tests/SUBMODULES.json
Modified    :   external/referencesource
Modified    :   mcs/class/Facades/Makefile
Modified    :   mcs/class/Mono.Cairo/Mono.Cairo/Context.cs
Modified    :   mcs/class/Mono.Security/Mono.Security.Interface/CertificateValidationHelper.cs
Modified    :   mcs/class/Mono.Security/Mono.Security.Interface/MonoTlsProvider.cs
Modified    :   mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/ActionBlockTest.cs
Modified    :   mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/BatchBlockTest.cs
Modified    :   mcs/class/System.Threading.Tasks.Data
变成:

    var since = new DateTimeOffset(DateTime.Now.AddDays(-7));
    var until = new DateTimeOffset(DateTime.Now.AddDays(-2));
    var filteredCommitLog = commitLog.Where(c => c.Committer.When > since && c.Committer.When < until);
    foreach (Commit commit in filteredCommitLog)
    {
        Console.WriteLine("{0} : {1}", commit.Committer.When.ToLocalTime(), commit.MessageShort);
        foreach (var parent in commit.Parents) {
            foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(parent.Tree, commit.Tree)) {
                Console.WriteLine ("\t{0} :\t{1}", change.Status, change.OldPath);
            }
        }
    }
foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(filteredCommitLog.First().Tree, filteredCommitLog.Last().Tree)) {
    Console.WriteLine ("\t{0}\t:\t{1}", change.Status, change.OldPath);
}

后来我确实采取了不同的方法来解决这个问题

using(var repo = new Repository("c:\\_Temp\\Repo"))
{
 List<string> shalist = new List<string>();
 foreach(Commit c in repo.Commits)
 {
  DateTime since = DateTime.Parse("10/29/2015 12:00:00 AM");
  DateTime untill= c.Author.When.Date;

  if(untill >= since)
   {
     shalist.Add(c.sha.Tostring());
   }
  }

  Tree cmTree1 = repo.Lookup<Commit>(shalist.First()).Tree;  
  Tree cmTree2 = repo.Lookup<Commit>(shalist.Last()).Tree;

  var patch = repo.Diff.Compare<patch>(cmTree1, cmTree2);

  foreach(var ptc in patch)
  {
   Console.WriteLine(ptc.Path);
  }     
}
使用(var repo=new Repository(“c:\\\\ U Temp\\repo”))
{
列表列表=新列表();
foreach(在repo.Commits中提交c)
{
DateTime-since=DateTime.Parse(“10/29/2015 12:00:00 AM”);
DateTime untill=c.Author.When.Date;
如果(直到>=自)
{
添加(c.sha.Tostring());
}
}
Tree cmTree1=repo.Lookup(shalist.First()).Tree;
Tree cmTree2=repo.Lookup(shalist.Last()).Tree;
var patch=回购差异比较(cmTree1,cmTree2);
foreach(补丁中的var ptc)
{
控制台写入线(ptc.Path);
}     
}

这将显示日期范围
自-untill以来更改的所有文件。此方法将枚举存储库中的所有提交。我强烈建议您使用@RobertN建议的
CommitFilter
,这样效率更高。我实际上更新了我的答案,因为我完全没有在答案中添加文件列表部分,对此表示抱歉。。。。仅供参考:@nulltoken在预过滤方面是完全正确的,如果您的回购协议有少量提交,那么没有什么大问题,但要处理成百上千等问题。。然后尽可能多地进行预筛选,这将大大有助于……@RobertN,是的,更新很好!在使用你的想法之前,我已经做了必要的修改1.效果很好。是的,我有很多承诺。。所以你的方法更好我注意到了一些奇怪的事情。假设昨天和今天之间只存在一个提交。因此,您的方法将该日期范围内存在的唯一提交与其自身(第一个和最后一个)进行比较,并说“无更改!!”。我在那里迷路了。。我需要帮助。Treechanges是什么?。是否可以从树中列出文件或提交(sha)?@RobertN@nulltoken@flute如果您的筛选器只返回一个提交,您需要比较两个
commish
以查看更改的内容,而不是您希望将其与哪个其他提交进行比较?如果合适的话,您可以使用单个提交的父级。