Как объединить уже выбранные удаленные коммиты с помощью LIBGIT2SHARP - PullRequest
0 голосов
/ 06 мая 2020

У меня есть приложение, которое клонирует удаленный репозиторий git (в BitBucket) локально, а затем поддерживает список коммитов, которых нет в локальном репозитории, выполняя периодическую c выборку из репозитория. Это позволяет мне видеть и перечислять недостающие коммиты, чтобы пользователь знал, чего не хватает локально.

Я хотел бы предложить пользователю возможность объединить уже выбранные коммиты в локальный репозиторий. Однако, когда я пытаюсь это сделать, он, по-видимому, сбрасывает HEAD локального репозитория на первую фиксацию, и теперь кажется, что все коммиты с начала времени отсутствуют в моей локальной копии.

За время существования репо было совершено 308 коммитов. Моя локальная копия, полученная, но не объединенная, отстала на 6 коммитов. Если я вызываю GetRemoteCommits() (см. Ниже), он правильно возвращает список из 6 коммитов, а свойство, вызываемое BehindBy, соглашается, что я отстаю на 6.

Если я затем позвоню MergeUpdates(MostRecentCommitSha) I кажется, чтобы объединить репозитории (я вижу недавно зафиксированные файлы в моем локальном рабочем каталоге). Однако, если я снова позвоню GetRemoteCommits(), я верну список всех 308 коммитов. Если я проверю свойство BehindBy, оно показывает 0, поэтому внутренне libgit2sharp знает, что я догнал, но каким-то образом мой метод чтения списка коммитов не работает.

Что не так с моим кодом слияния или, альтернативно, почему мой метод считывания недостающих коммитов больше не работает после слияния?

Вот мой код для слияния:

    public int MergeUpdates(string remoteCommitSha)
    {

        var commit = GetRemoteCommits().FirstOrDefault(cm => cm.Sha == remoteCommitSha);
        if (commit == null)
        {
            throw new Exception($"Commit {remoteCommitSha} not found.");
        }

        var signature = new Signature(new Identity("someid", "someid@someplace.com"), DateTime.Now);
        _gitRepository.Merge(commit, signature);

        return 1;

    }

И код в GetRemoteCommits:

    public List<Commit> GetRemoteCommits()
    {

        // Fetch code removed.

        Branch master = _gitRepository.Branches["master"];

        if (master.TrackingDetails == null || master.TrackingDetails.BehindBy == null)
        {
            throw new Exception("Not tracked?");
        }

        // The tracked branch commit list is all commits in the remote from most recent.
        // We can infer the ones missing in the local repository by walking down this list
        // until we find the current repository tip.
        var missingList = new List<Commit>();
        foreach (var commit in master.TrackedBranch.Commits)
        {
            if (commit.Sha == master.Tip.Sha)
            {
                break;
            }
            missingList.Add(commit);
        }

        // NOTE: Before merge matches missingList.Count but after does not match!!!!
        var behindBy = (int)master.TrackingDetails.BehindBy;

        // Really would like to return the actual commits
        return missingList;

    }
...