【问题标题】:using libgit2sharp to pull latest from a branch使用 libgit2sharp 从分支中提取最新信息
【发布时间】:2017-03-07 22:22:39
【问题描述】:

我在 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 远程存储库路径是什么。有人有什么建议吗?

在研究这个问题时,我发现:https://github.com/libgit2/libgit2sharp/issues/1235。本质上,libgit2sharp 开发人员描述了我看到的确切问题,但没有提供任何修复代码。

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

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

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

【问题讨论】:

    标签: c# git libgit2sharp


    【解决方案1】:

    您可以使用 Refspec 在本地分支上设置跟踪分支信息:

    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'.
    

    【讨论】:

    • 好的,你的回答很有帮助,但我仍然发现它存在一些问题。如果我在此结帐后进行拉动,我仍然会收到相同的错误消息。我还认为您需要将 repo.checkout 移到 isremote 检查块之外,否则您只需在初始创建时结帐。我更新了结帐代码,以便您可以看到我所做的更改。
    • 我检查了使用您的代码示例创建的分支,它们似乎指向正确的遥控器,但后续拉取请求会引发与以前相同的异常。
    • @MadTigger 我并没有为您的代码编写一个完整的替代品,只是展示了一个跟踪分支示例。在你的错误点,如果你掉到一个 cmd 行,git 会回复同样的错误吗?如果是这样,是否有一个有效的跟踪分支分配给您结帐的分支(通过 libgit2sharp)?
    • 当我遇到错误并通过 bash shell 检查 git 时,它已检出正确的分支,并且一个普通的“Git Pull”解决得很好。我认为存储库或分支的状态没有任何问题,我在 libgit2sharp 中必须缺少一些简单的开关或步骤。
    • 我发现并纠正了问题。您的代码示例基本上可以工作,但我现有的分支需要手动更正,因为 libgit2sharp 代码示例使它们处于没有遥控器的状态。我在查看 Git 的配置值时发现了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多