Подтвердить что ты не робот

Как обрабатывать широко распространенные изменения формата кода в репозитории git

У нас есть проект с примерно 500 000 строк кода, который управляется с помощью git, большая часть из которых - несколько лет. Мы собираемся внести ряд изменений, чтобы привести старый код в соответствие с существующими стандартами сообщества и лучшими практиками в отношении соглашений об именах, обработке исключений, отступов и т.д.

Вы можете думать об этом как о чем-то между красивой печатью и низким уровнем/механическим рефакторингом.

Этот процесс, вероятно, затронет почти каждую строку кода в базе кода (~ 85%), а некоторые строки будут подвержены целым пяти модификациям. Все изменения должны быть семантически нейтральными.

Есть ли способ сделать изменения прозрачными для git вины и т.д., чтобы при просмотре кода через месяц мы увидели фиксацию логики, а не та, в которой отступ или капитализация была изменена? Какой лучший способ вытащить сливки из вилок, которые не прошли этот процесс? Мой нынешний план состоял бы в том, чтобы клонировать script разветвленное репо, применять автоматизированный процесс к нему и его базе, различать их, а затем применять diff. Но я хотел бы получить более чистый ответ. Есть ли какие-либо другие проблемы такого типа, которые я не вижу, и если да, то что можно сделать для их смягчения? Я полагаю, что git bisect и т.д. Должны быть в порядке, git log и т.д., Пересекая большой разрыв, будет раздражать, если вы не будете осторожны, а git diff будет безнадежным, но я не уверен Я не пропущу другую точку боли.
4b9b3361

Ответ 1

Я не знаю, как лучше всего справляться с некоторыми более инвазивными изменениями, которые вы описываете, но...

Параметр -w для git blame, git diff и других вызывает git игнорировать изменения в пробеле, поэтому вы можете более легко увидеть реальные различия.

Ответ 2

Я бы рекомендовал делать эти эволюции один шаг за раз в центральном репозитории Git (как в "общедоступной ссылке" для всех остальных репозиториев):

  • Отступ
  • затем методы переупорядочения
  • затем переименование
  • затем...

Но не "отступ-переупорядочение-переименование -...- один гигант совершает".

Таким образом, вы даете Git разумную возможность следить за изменениями в модификациях рефакторинга.

Кроме того, я бы не принял никакого нового слияния (вытащил из другого репо), который не применял тот же рефакторинг, прежде чем нажимать свой код.
Если применение процесса форматирования приводит к любым изменениям в извлеченном коде, вы можете отклонить его и попросить удаленное репо сначала соответствовать новым стандартам (по крайней мере, вытащив из своего репо, прежде чем делать больше нажатий).

Ответ 3

Вам также понадобится mergetool, позволяющий агрессивно игнорировать пробелы. p4merge делает это и свободно загружается.

Ответ 4

В этом question есть хорошее решение. Вкратце используйте git filter-branch.

Я использовал для себя этот код:

git filter-branch --tree-filter "git diff-tree --name-only --diff-filter=AM -r --no-commit-id \$GIT_COMMIT | grep '.*cpp\|.*h' | xargs ./emacs-script" HEAD

Какой ./emacs-script является script, я написал, используя emacs, чтобы изменить стиль кода, просто просто вызывается indent-region для каждого файла.

Этот код отлично работает, если нет файлов, удаленных или удаленных из репозитория. В этой ситуации использование --ignore-unmatch может оказаться полезным, но я не уверен.