Извлечение информации об авторстве из репозитория 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 украсил ее для вас.