Вытяните конкретную фиксацию, используя libgit2sharp

надеюсь, кто-нибудь вызовет помощь. Во-первых, я новичок в git, поэтому простите меня, если я допущу ошибки при объяснении своего вопроса.

Я хотел бы получить исходный код в том виде, в каком он существует, до конкретной фиксации с использованием библиотеки с использованием libgit2sharp. Итак, если есть история

  1. Совершить
  2. Совершить
  3. Совершить
  4. Совершить
  5. Совершить
  6. Совершить
  7. Совершить
  8. Совершить
  9. Совершить
  10. Совершить

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

Я просмотрел https://github.com/libgit2/libgit2sharp/wiki/git-pull, но, похоже, он не позволяет мне передать идентификатор sha или фиксации.

Отредактировал мой вопрос, чтобы было ясно, что я использую библиотеку.


person SpaceGhost440    schedule 14.02.2020    source источник
comment
git pull — это просто git fetch, за которым следует git merge в данной отслеживаемой ветке. Здесь вы имеете дело с коммитами, и я предполагаю, что вы уже получили коммиты локально, поэтому просто git merge sha-1.   -  person Adam    schedule 14.02.2020
comment
Адам, я использую библиотеку libgit2sharp, а не командную строку. Спасибо, но мне нужно, как это сделать с помощью библиотеки. Однако, основываясь на моем исследовании, это именно те шаги, которые мне нужно выполнить.   -  person SpaceGhost440    schedule 14.02.2020
comment
почему вы не используете стандартный git?   -  person xpto    schedule 14.02.2020
comment
Пожалуйста, я бы предпочел не засорять вопрос обсуждением того, почему я не использую командную строку. :) Достаточно сказать, что я использую библиотеку и хотел бы знать, как достичь цели с помощью библиотеки.   -  person SpaceGhost440    schedule 14.02.2020
comment
LibGit2 — довольно низкоуровневая библиотека, вам нужно действительно понимать базу данных Git (все основные структуры данных) наизусть, чтобы продолжить. Тем не менее, вам нужно заново реализовать большой блок, так называемый git checkout, используя множество маленьких блоков.   -  person 0andriy    schedule 15.02.2020


Ответы (1)


Итак, другой разработчик ответил на вопрос. Все, что мне нужно было сделать, это клонировать, а затем проверить фиксацию, к которой я хотел вернуться. Кажется, это работает так, как я хотел.

//clone the master 
dir = Path.Combine(localPath, "Target");
Directory.CreateDirectory(dir);
Repository.Clone(tfsUri, dir);

//reset master to the base of the branch
using (var localRepo = new Repository(dir))
{
    var localCommit = localRepo.Lookup<Commit>(priorCommitId);
    Commands.Checkout(localRepo, localCommit);
}

Не уверен, что это то, что вы имели в виду, @0andriy, но ваш комментарий немного сбил с толку.

person SpaceGhost440    schedule 15.02.2020
comment
Я имел в виду, что вместо git checkout вызова в терминале нужно сделать много. Кроме того, выше — карго-культ, о том, что он делает внутри, вы понятия не имеете. Тем не менее, вы можете легко повредить данные в своем репозитории, не зная, что произошло. - person 0andriy; 15.02.2020