У меня есть приложение, которое клонирует удаленный репозиторий 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;
}