代码之家  ›  专栏  ›  技术社区  ›  solti

如果远程回购发生变化,NGit中的方法是什么?

  •  1
  • solti  · 技术社区  · 10 年前

    我正在尝试使用 IsClean() 从…起 NGit 为了确定在工作副本中是否检测到任何更改,它可以正常工作,但当我试图查看远程中是否有任何更改时,我认为IsClean()不是正确的方法。所以我想知道,是否有其他方法可以帮助我看到远程所做的改变。我尝试过拉远程回购,但似乎不起作用,有人知道NGit中是否有这样的方法吗。

           var repository = Git.Open(activeRepopath);
           var status = repository.Status().Call();
           Consoel.WriteLine(stauts.IsClean());
    
           while (status.IsClean())
           {
                repository.Pull().Call();
    
           }
    

    我从 here 在IsClean()上。

    我实际上想要类似于buildbot的东西 gitpoller 如果有人能告诉我如何开始,我很乐意朝这个方向努力。

    2 回复  |  直到 10 年前
        1
  •  4
  •   Community davidgyoung    7 年前

    在你给自己的解决方案中,你正在获取遥控器。这会更改您的本地存储库远程引用,并且可能是您想要的,也可能不是您想要的。在这个答案中: How to know local repo is different from remote repo, without fetch? 概述了如何使用 ls-remote 命令,或 LsRemote 在这种情况下使用NGit。

    检查而不提取可能如下所示:

    var repository = Git.Open(activeRepopath);
    ICollection<Ref> refs = repository.LsRemote().SetHeads(true).SetTags(true).Call();
    
    // Compare the results of GetObjectId() of refs with 'oldRefs', obtained
    // previously, to find out if tags or heads changed between the two calls.
    // Possibly:
    var newIds = refs.Select(r => r.GetObjectId().ToString()).OrderBy(r => r);
    var oldIds = oldRefs.Select(r => r.GetObjectId().ToString()).OrderBy(r => r);
    if (!newIds.SequenceEqual(oldIds)) {
         Console.WriteLine("Something changed");
    }
    
        2
  •  0
  •   solti    10 年前

    这里我使用test_value来存储已更改的远程文件的数量。最初它是零,如果远程中发生了一些变化,它的test_value会变为1或2,这取决于更改的文件数量,这有助于避免循环,我们知道发生了变化。

    var repository = Git.Open(activeRepopath);
    int test_value = 0; 
    ICollection<TrackingRefUpdate> refUpdate = null;
    
    while (test_value == 0 )
    {
    
        FetchResult result = repository.Fetch().Call();
        refUpdate = result.GetTrackingRefUpdates();
        test_value = refUpdate.Count();
        Console.Write(test_value);
    
    }
    
    Console.WriteLine("Something changed");