在NGit中查看远程仓库是否发生变化的方法是什么?

时间:2014-04-03 13:19:44

标签: c# git ngit

我正在尝试使用NGit中的 IsClean()来确定是否在工作副本中检测到任何更改,它可以正常工作但是当我尝试查看是否有任何更改时远程我不认为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 个答案:

答案 0 :(得分:4)

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

不提取检查可以如下所示:

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");
}

答案 1 :(得分:0)

这里我使用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");