1

我正在尝试使用Ngit 中的IsClean ()来确定是否在工作副本中检测到任何更改,它工作正常,但是当我尝试查看远程中是否有任何更改时,我认为 IsClean() 不是正确的方法尝试。所以我想知道是否有任何其他方法可以帮助我看到远程所做的更改。我尝试拉远程 repo,但它似乎不起作用,有谁知道 Ngit 中是否有任何方法可以解决这个问题。

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

       while (status.IsClean())
       {
            repository.Pull().Call();

       }

我在 IsClean() 上从这里找到了教程。

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

4

2 回答 2

4

在您给自己的解决方案中,您正在获取遥控器。这会更改您的本地存储库远程引用,并且可能会或可能不会是您想要的。在这个答案中: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");
}
于 2014-04-09T11:52:27.250 回答
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");
于 2014-04-07T00:40:06.633 回答