Со стороны Git: команда filter-branch
1 в принципе работает следующим образом:
- извлечение каждого коммита по одному во временный каталог;
- запуск ваших фильтров в временном каталоге на, в котором был извлечен коммит; а потом
- создание нового коммита замены из результатов, оставленных в каталоге.
Замещающие коммиты связываются вместе, по одному, обычным способом, и когда все коммиты отфильтрованы, Git обновляет различные ветки и другие подобные ссылки (--all
) по мере необходимости, при этом --tag-name-filter
определяет новые имена тегов (для вас случае это все правильно).
Метод --tree-filter
, который на сегодняшний день является самым медленным фильтром, использует этот подход без каких-либо оптимизаций. Существуют другие фильтры, чтобы (а) работать быстрее, если вы не планируете трогать большую часть файлов и / или (б) вносить изменения в такие вещи, как фиксация сообщений или другие метаданные, вместо или в дополнение к снимкам. Вероятно, нет смысла пытаться использовать более оптимальный фильтр, поскольку вам действительно нужно извлечь все файлы, чтобы их переформатировать. Так что здесь нужно убрать то, что каждый запуск в формате clang будет запускаться в частном временном каталоге, не содержащем репозитория Git. $PWD
этой команды будет этим частным каталогом.
Чтобы ускорить процесс, рекомендуется использовать параметр -d
, чтобы поместить этот частный каталог в память или на твердотельный накопитель или в другую файловую систему с быстрым доступом. Например, если /tmp
- файловая система в памяти, mkdir /tmp/foo; git filter-branch -d /tmp/foo ...
может работать намного быстрее, чем система без директивы -d /tmp/foo
. По умолчанию -d
- это подкаталог, который Git создает внутри каталога .git
; если это медленная, но высоконадежная файловая система, ваша операция ветвления фильтра будет выполняться очень медленно.
Со стороны формата clang: используйте любые -style=
параметры, которые вам нравятся. Как отмечали многочисленные комментаторы, удаление конечных пробелов используется по умолчанию (и, по-видимому, сейчас нет никаких вариантов для управления этим).
Обратите внимание, что можно добавить .clang-format
файл во временный каталог. Если вы оставите его там, он будет добавляться в каждый коммит замены. Если вы удалите его снова после добавления, отсутствие файла .clang-format
(потому что вы его удалили) будет тем, что есть в каждой фиксации. Если вы ничего не сделаете, будет или не будет .clang-format
файла в зависимости от того, был ли он в фильтруемом коммите.
Если вы решите, что, в конце концов, вы хотели бы использовать .clang-format
файл и добавлять его в каждую фиксацию, обратите внимание, что вам придется копировать файл из-за пределов временного каталог, в временный каталог, перед каждым запуском clang-format
, потому что Git сам очищает временный каталог между каждой фиксацией. Обратите внимание, что вы не будете знать, где находится временный каталог, 2, поэтому для копирования известного файла используйте, например, полный путь: cp /tmp/new-clang-format-file .clang-format && clang-format -style=file
.
1 git filter-branch
сейчас номинально устарел, но его замена, filter-repo
, не включена в Git, поэтому здесь возникает небольшая дилемма. Вы можете установить filter-repo отдельно, или для такого рода одноразовой работы вы можете просто жить с filter-branch.
2 Даже с параметром -d
Git создает различные подкаталоги указанного вами каталога (он удаляет кучу временных файлов в разных местах для своих собственных целей).
person
torek
schedule
04.02.2021
.clang-format
в каталог. - person mercury   schedule 05.02.2021git filter-branch
перезаписывает историю, которая по определению касается содержимого папки .git. - person mkrieger1   schedule 05.02.2021sed
могут повредить файлы в папке.git
. Я просто сказал это, чтобы предотвратить некоторые безумные предложения. - person mercury   schedule 05.02.2021git filter-branch
. Он создан для этого и не убьет себя. - person mkrieger1   schedule 05.02.2021.clang-format
как я могу поставить IndentWith на встроенный переключатель, а также какова команда для конечных пробелов? - person mercury   schedule 05.02.2021-style=Google
очень плохо. Я объяснил, почему не использую этот метод. - person mercury   schedule 05.02.2021-style=Google
. Я просто указал вам на ответ, в котором говорится, что clang-format в любом случае удаляет конечные пробелы. - person mkrieger1   schedule 05.02.2021