使用libgit2sharp从分支中提取最新信息

时间:2017-03-07 22:22:39

标签: c# git libgit2sharp

我在c#解决方案中使用libgit2sharp来切换到分支并引入最新的更改。这是我正在使用的代码:

    public void FetchAll()
    {
        using (var repo = new Repository(_LocalGitPath))
        {
            foreach (Remote remote in repo.Network.Remotes)
            {
                FetchOptions options = new FetchOptions();
                options.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials()
                {
                    Username = _UserName,
                    Password = _Password
                });
                repo.Network.Fetch(remote, options);
            }
        }
    }
    public string CheckoutBranch(string branchName)
    {
        using (var repo = new Repository(_LocalGitPath))
        {
            var trackingBranch = repo.Branches[branchName];

            if (trackingBranch.IsRemote)
            {
                branchName = branchName.Replace("origin/", string.Empty);

                var branch = repo.CreateBranch(branchName, trackingBranch.Tip);
                repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName);
                Commands.Checkout(repo, branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
            }
            else
            {
                Commands.Checkout(repo, trackingBranch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
            }

            return branchName;
        }
    }
    public void PullBranch(string branchName)
    {
        using (var repo = new Repository(_LocalGitPath))
        {
            PullOptions options = new PullOptions();

            options.MergeOptions = new MergeOptions();
            options.MergeOptions.FailOnConflict = true;

            options.FetchOptions = new FetchOptions();
            options.FetchOptions.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials()
            {
                Username = _UserName,
                Password = _Password
            });

            repo.Network.Pull(new Signature(_UserName, _Password, new DateTimeOffset(DateTime.Now)), options);
        }
    }

我在抓取和检查分支时没有问题。当我尝试提取最新信息时,我收到一条错误消息,“当前分支机构没有跟踪信息。”我相信这意味着本地分支不知道正确的远程存储库是什么来提取更改,但我还没有弄清楚如何告诉libgit2sharp远程repo路径是什么。有人有什么建议吗?

在对此问题进行研究时,我发现了这一点:https://github.com/libgit2/libgit2sharp/issues/1235。本质上,libgit2sharp dev描述了我看到的确切问题,但没有为修复提供任何代码。

另外一个注意事项:我永远不会合并或推送任何更改从此存储库返回。我将它拉为自动构建,因此我们可以忽略或覆盖任何本地更改。我只需要获取最新的代码。

解: 我已经使用我工作的解决方案更新了上面的代码。您需要非常小心地确保在签出分支时检查您要检出的分支上的isRemote标志是否设置为true。如果您签出一个非远程分支,它会将远程设置为'。'在您的git配置文件中,您需要手动修复它。如果没有有效的遥控器,您将无法拉动分支更改。

不要在libgit2sharp wiki上使用代码示例,除非他们添加此签入。

1 个答案:

答案 0 :(得分:2)

您可以使用Refspec:

在本地分支上设置跟踪brach信息
using (var repo = new Repository("/Users/sushi/code/redux/mono"))
{
    var trackingBranch = repo.Branches["remotes/origin/work-btls"];
    if (trackingBranch.IsRemote)
    {
        var branch = repo.CreateBranch("SomeLocalBranchName", trackingBranch.Tip);
        repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName);
        repo.Checkout(branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force });
    }
}

您可以使用git来验证SomeLocalBranchName现在正在跟踪remotes/origin/work-btls

>>>git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

SomeLocalBranchName <- remotes/origin/work-btls
master <- origin/master 

>>>git status

On branch SomeLocalBranchName
Your branch is up-to-date with 'remotes/origin/work-btls'.