Извлечение информации об авторстве из репозитория git

Я пытаюсь извлечь (строка исходного кода, метка автора) из репозиториев git. Самый простой способ сделать это - использовать мерзавец. Проблема заключается в том, что git blame принимает последнего коммиттера в качестве автора, независимо от того, просто ли коммиттер делает отступ или действительно изменяет код. Вы знаете какой-нибудь способ лучше?

Или, может быть, прежде чем пытаться решить проблему, я должен сначала проверить, сколько строк исходного текста связано с несколькими авторами. Если процент невелик, вам не о чем беспокоиться. Но я считаю, что даже подсчитать число сложно. Для коммита с одним родителем, как мы можем знать, что коммит изменил строку, а скорее удалил строку и добавил линейный? Для коммита с двумя родителями (например, слияния), как мне объединить результаты сравнения двух ветвей?

Спасибо

1 ответ

Решение

обзор

Это фундаментальное недопонимание того, как работает Git. Git не фиксирует патчи или различия; он связывает деревья и сгустки, хотя упаковочные файлы, безусловно, делают своего рода разграничение. Большая часть истории коммитов рассчитывается во время выполнения с некоторой разновидностью diff.

Другими словами, если ваши инструменты сравнения могут делать то, что вы хотите, то же самое можно сказать и о Git.

ГИТ-порицание

Команда git-blame не будет делать то, что вы хотите, потому что страница руководства говорит (выделение мое):

Аннотирует каждую строку в данном файле информацией из ревизии, которая последний раз изменяла строку.

Другими словами, он строго ориентирован на линию.

ГИТ-журнал

Вы можете приблизиться к тому, что вы хотите с помощью git-log. Например:

# Show diffs with indifference to whitespace changes (e.g. indenting).
git log --patch --ignore-space-change

# Just ignore whitespace altogether.
git log --patch --ignore-all-space

# Show deletions with [- -] and additions with {+ +}.
git log --patch --word-diff=plain

# Custom diff format where ~ denotes newlines.
git log --patch --word-diff=porcelain

Фарфоровый формат предназначен для обработки текста, но он очень неинтуитивен с визуальной точки зрения. Тем не менее, это хорошо документировано в man 1 git-diff для вашего удовольствия программирования.

Недостатком является то, что вам придется получать информацию об авторе от GIT_AUTHOR_NAME или GIT_COMMITTER_NAME, связанной с каждым коммитом, вместо того, чтобы Git украсил ее для вас.

Другие вопросы по тегам