используя libgit2sharp, чтобы вытащить последнюю ветку

2

Я использую 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 dev описывает точную проблему, которую я вижу, но не предоставляет никакого кода для исправления.

Еще одно примечание: я никогда не буду сливать или выталкивать какие-либо изменения из этого репозитория. Я потянул его за автоматическую сборку, поэтому мы можем игнорировать или перезаписывать любые локальные изменения. Мне просто нужно получить последний код.

РЕШЕНИЕ: Я обновил код выше с помощью решения, которое я получил. Вы должны быть очень осторожны, чтобы убедиться, что когда вы проверяете ветку, вы проверяете флажок isRemote на ветки, которую вы проверяете, на значение true. Если вы проверите ветку, которая не является удаленной, она установит пульт на ".". в вашем конфигурационном файле git, и вам нужно вручную его исправить. Если нет действительного пульта дистанционного управления, вы не сможете потянуть изменения ветки.

Не используйте образец кода в wiki libgit2sharp, если они не добавят эту проверку.

Теги:
libgit2sharp

1 ответ

2
Лучший ответ

Вы можете настроить информацию отслеживания в локальной ветке с помощью 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'.
  • 0
    Хорошо, ваш ответ был полезен, но я все еще вижу некоторые проблемы с ним. Если после этой проверки я выполняю выборку, я получаю то же сообщение об ошибке. Я также думаю, что вам нужно переместить repo.checkout за пределы блока проверки isremote, иначе вы извлекаете только при первоначальном создании. Я обновил код проверки, чтобы вы могли видеть, что я изменил.
  • 0
    Я проверил ветви, которые были созданы с вашим примером кода, и они, казалось, указывали на правильные пульты, но последующий запрос на получение выдает то же исключение, что и раньше.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню