То, что вы пытаетесь сделать, невозможно.Вы не можете в какой-то момент изменить строку кода, и все же получить git отчет о том, что самое последнее изменение этой строки кода произошло в тот момент до этого момента.
Полагаю, источникинструмент управления может поддерживать идею "несущественного изменения", когда вы помечаете коммит как косметический, а затем анализ истории пропускает этот коммит.Я не уверен, как инструмент будет проверять, действительно ли изменение было косметическим, и без какой-либо формы принудительного применения инструмента эта функция наверняка будет использована неправильно, что приведет к появлению ошибок, которые могут быть скрыты в «неважных» фиксациях.Но на самом деле причины, по которым я считаю, что это плохая идея, академичны - суть в том, что у git такой функции нет.(И при этом я не могу думать ни о каком инструменте контроля источника, который делает.)
Вы можете изменить форматирование в будущем.Вы можете сохранить видимость прошлых изменений.Вы можете избежать редактирования истории.Но вы не можете делать все три одновременно, поэтому вам придется решить, какой из них пожертвовать.
Кстати, есть несколько недостатков в переписывании истории.Вы упомянули время обработки, поэтому давайте сначала посмотрим на это:
Как вы заметили, простой способ сделать это с filter-branch
будет очень трудоемким.Есть вещи, которые вы можете сделать, чтобы ускорить его (например, дать ему виртуальный диск для его рабочего дерева), но это tree-filter
, и он включает в себя обработку каждой версии каждого файла.
Если вы сделали некоторые предварительные-обработка, вы могли бы быть несколько более эффективным.Например, вы можете предварительно обработать каждый BLOB
в базе данных и создать отображение (где TREE
содержит BLOB
X, заменить его на BLOB
Y), а затем использовать index-filter
для выполнениязамены.Это позволит избежать всех операций извлечения и добавления и избежать повторного форматирования одних и тех же файлов кода.Так что это экономит много ввода-вывода.Но это нетривиальная вещь для настройки, и все же может занять много времени.
(Можно написать более специализированный инструмент, основанный на этом же принципе, но AFAIK никто не написал. Есть прецедент, чтоболее специализированные инструменты могут быть быстрее, чем filter-branch
...)
Даже если вы найдете решение, которое будет работать достаточно быстро, имейте в виду, что переписывание истории нарушит все ваши ссылки.Как и при любом переписывании истории, всем пользователям репо будет необходимо обновить свои клоны - и для чего-то такого стремительного, я рекомендую сделать это, выбрасывая клонов до того, как вы начнете переписывать, а потом снова клонировать.
Это также означает, что если у вас есть что-то, что зависит от идентификаторов коммитов, это также будет нарушено.(Это может включать в себя инфраструктуру сборки, релизную документацию и т. Д .; в зависимости от практики вашего проекта.)
Итак, переписывание истории - довольно радикальное решение.И с другой стороны, кажется также решительным предположить, что форматирование кода невозможно просто потому, что это не было сделано с первого дня. Поэтому мой совет:
Выполните переформатирование в новом коммите.Если вам нужно использовать git blame
, и он указывает вам на коммит, в котором произошло переформатирование, то снова запустите git blame
для родительского коммита переформатирования.
Да, это отстой.Какое-то время.Но с течением времени определенный кусочек истории становится менее важным, поэтому оттуда вы просто позволяете проблеме постепенно уйти в прошлое.