Я работаю с libgit2sharp (обертка C# для libgit2) и сталкиваюсь с проблемами, потому что у него нет многих функций, на которые я надеюсь (надеюсь, я смогу внести свой вклад в него в ближайшее время; это кажется действительно полезным проектом)
То, что я пытаюсь сделать прямо сейчас, — это получить список файлов, измененных из определенного коммита и его родителя. Я не буду пытаться выяснить, что изменилось между слиянием и двумя его родителями. Меня больше интересуют регулярные коммиты.
Эти ребята (https://github.com/libgit2/libgit2sharp/issues/89) работают над чем-то подобным. Я думаю, что их процедура - здравая идея, но я немного слаб в своем понимании внутреннего устройства GIT (в руководстве конечного пользователя по GIT есть множество руководств, но не так много по внутренней структуре)
Мне любопытно, как сам GIT выполняет команду «git diff». Предположительно, GIT на самом деле хранит не дельты, а полную версию файла (если он не изменился, он просто укажет на существующий SHA. Эту информацию можно найти из различных источников, таких как здесь http://xentac.net/2012/01/19/the-real-difference-between-git-and-mercurial.html). Кажется, это усложняет получение изменений между двумя фиксациями (в моем случае конкретной фиксацией и ее единственным родителем), потому что данные не хранятся как часть фиксации (что становится ясно, если вы изучите класс Commit в libgit2sharp Commit.cs). файл).
К чему я могу получить доступ из коммита, так это к дереву. Имеет ли смысл сделать следующее, чтобы найти эту информацию:
1) Начните с нужного коммита, пройдитесь по дереву и сохраните все значения SHA в наборе.
2) Начните с родителя для нужного коммита и пройдите вниз по его дереву, чтобы сохранить все его значения SHA больших двоичных объектов в другом наборе.
3) SHA для измененных файлов будут файлами, которые не находятся на пересечении двух наборов.
Проблема, которую я вижу с этим подходом, заключается в том, что не похоже, что есть способ получить имя файла из значения SHA блоба (я не вижу ничего, что могло бы сделать это в файле libgit2sharp Blob.cs).
Я знаю, что у этого вопроса много аспектов, но они являются частью этой большой цели — получить определенный фрагмент данных из git.
Спасибо.
Blob
через его SHA будут указывать разныеTreeEntries
с разными именами файлов. Это произойдет, когда файлы будут иметь одинаковое содержимое. - person nulltoken   schedule 03.02.2012