Как сохранить автора git построчно при использовании средства форматирования кода?
Мы устали от ворса. Поэтому мы хотим использовать черный цвет в нашем проекте. К сожалению, это меняет почти все остальные строки в нашем проекте, что может привести к потере большей части информации об авторстве. Мы используем annotate
в пичарме или git blame
много, чтобы выяснить, с кем можно поговорить, глядя на конкретные куски кода. Как можно сохранить эту информацию при изменении большого количества файлов за один коммит?
Изменить: так как это дубликат этого вопроса, я хотел бы сосредоточиться скорее на "как можно лучше" подход.
Давайте предположим, что фиксация lint создана искусственным (но известным) автором, следовательно, служит в качестве флага. Можно ли создать git blame
как вывод, который показывает всех авторов, начиная с этой фиксации ключа, а также любого предыдущего автора строк, которые были изменены в этой фиксации?
Я понимаю, что это не будет работать хорошо для линий, которые были разделены / объединены, но это по крайней мере дает более быстрый способ ограничить круг потенциальных людей, с которыми можно разговаривать, до 1,2,3 человек.
2 ответа
Из https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt:
--ignore-rev
Игнорируйте изменения, внесенные ревизией, при назначении ответственности, как если бы изменения никогда не происходили. Строки, которые были изменены или добавлены игнорируемой фиксацией, будут возложены на предыдущую фиксацию, которая изменила эту строку или соседние строки. Эта опция может быть указана несколько раз, чтобы игнорировать более одной ревизии. Если установлен параметр конфигурации blame.markIgnoredLines, то строки, которые были изменены проигнорированной фиксацией и отнесены к другой фиксации, будут отмечены знаком? в виноватом выводе. Если установлена опция конфигурации blame.markUnblamableLines, то те строки, затронутые проигнорированной фиксацией, которые мы не смогли отнести к другой ревизии, помечаются *.
Если форматирование кода выполняется за один коммит, я думаю, вы могли бы использовать этот флаг. Также есть
--ignore-revs-file
это выглядит полезным, если вы хотите игнорировать более одного коммита.
Я создал сценарий, который изменяет только строки данного автора. Каждый автор мог применить это к базе кода и сохранить авторство кода.
import git
import black
from blib2to3.pgen2.tokenize import TokenError
new_lines = list()
author_email = "example@example.org"
filename = "setup.py"
for commit, lines in repo.blame('HEAD', filename):
if author_email == commit.author.email:
try:
new_lines.append(
black.format_str(
"\n".join(lines),
mode=black.Mode()
)
)
except:
new_lines.extend(lines)
else:
new_lines.extend(lines)
open(filename, "w").writelines(new_lines)
Сценарий может изменять только строки кода, которые вместе имеют смысл, чтобы они были черными. Если автор изменил только одну строку в многострочном заявлении, он не изменит ее. Поэтому после того, как каждый автор применил сценарий, некоторые строки все равно нужно заменить черным. Однако количество строк будет намного меньше, чем раньше.
Обновления можно найти здесь: https://gist.github.com/JulianWgs/ba762ba729d8f17090cafd5230261ab2