Я хочу запускать формат clang при каждой регистрации в любом отредактированном файле .cpp
и .h
в репозитории git и проверять, чтобы "основной файл включения" был сверху.
Существует опция фильтра для этого в .gitattributes
:
*.cpp filter=clang-format-cpp
*.h filter=clang-format-cpp
, для которой соответствующий фильтр может быть локально настроен с
git config --global filter.clang-format-cpp.clean 'clang-format -assume-filename=test.cpp'
Для звонка format, , есть опция IncludeIsMainRegex
, которая всегда помещает «основной файл включения» сверху. Например, IncludeIsMainRegex: '(test_?)?$'
для файла a.cpp
или test_a.cpp
, заголовок a.h
будет основным включением и, следовательно, помещен сверху.
Однако, когда файл отформатирован с помощью git Фильтр / Clang-формат, это главное включение не помещается сверху.
Задано
.clang-формат :
IncludeIsMainRegex: '(test_?)?$'
IncludeBlocks: Regroup
z. cpp:
#include "z.h"
#include "other.h"
#include <includes.h>
#include <here.h>
Ожидается
z. cpp:
#include "z.h"
#include "other.h"
#include <here.h>
#include <includes.h>
Результат
z. cpp:
#include "other.h"
#include "z.h"
#include <here.h>
#include <includes.h>
Очень вероятно, что файл отправляется в формате clang с использованием stdin / stdout, и поэтому формат clang не знать имя файла (или, скорее, предполагает, что оно тестовое. cpp) и, следовательно, не может определить основное включение.
Один из альтернативных подходов состоит в том, чтобы установить хук перед фиксацией и позволить ему исправить файл на месте при фиксации , Но исправление их при подготовке гораздо более упрощено, чем при фиксации.
Как можно интегрировать формат clang в рабочий процесс git, чтобы автоматически помещать основной включаемый файл поверх?
Для теперь я просто отключил IncludeIsMainRegex: false
, и он работает стабильно, независимо от того, вызывается ли clang-format
для файла или через фильтр git.