Попытка изменить базу, чтобы исправить фильтр атрибутов, но не удается из-за неустановленных изменений

Проблема

Не удалось применить фильтр очистки (отдельная проблема, не связанная с Git), в результате чего Git хранит «грязные» файлы. Я исправил фильтр, но теперь мне нужно очистить файлы, а затем сохранить их снова.

Что происходит

Из другого моего вопроса я знаю, что если файлы были зафиксированы без фильтра, когда есть присутствует активный фильтр, независимо от того, что я делаю, эти файлы будут рассматриваться как измененные, поскольку хэши не будут совпадать. Никакое количество git reset --hard или git stash не исправит это, и ничего больше.

Неудачное решение

Моей первой мыслью было сделать интерактивную перебазировку. Однако даже с --force не пускает. С параметром force он просто говорит, что это невозможно сделать, но без него Git жалуется на неустановленные изменения.

нельзя перебазировать: у вас есть неустановленные изменения

Безрезультатные поиски

Я попытался найти способ заставить Git игнорировать неустановленные изменения, но все это привело к обычным методам ОБРАБОТКИ неустановленных изменений (т.е. reset и stash).

Что я пытаюсь

В настоящее время я пытаюсь выполнить перебазирование вручную, но по какой-то причине это не работает должным образом. Еще слишком рано рассказывать подробности, и пришло время пообедать. Я собираюсь упомянуть об этом сейчас, так как это появилось в комментариях.

Единственное, что осталось, насколько я могу видеть.

Единственное решение, которое я могу придумать, это отложить текущий рабочий каталог, а затем git reset --hard last-good-commit. Затем я бы переместил файлы обратно и зафиксировал, но потерял бы историю, а я этого не хочу.

Под «потерей истории» я подразумеваю, что коммиты, ведущие к «настоящему», будут потеряны. Я хочу избежать этого.

Вопрос

Как заставить rebase в этом сценарии?


person Nero gris    schedule 10.08.2018    source источник
comment
(1) Как вы думаете, почему вы потеряете историю и что, по вашему мнению, это означает? Пожалуйста, будьте конкретны. (2) Что плохого в том, чтобы спрятать свою неустановленную работу перед несвязанной очисткой, а затем вытащить тайник после этого? Пожалуйста, будьте конкретны.   -  person jthill    schedule 10.08.2018
comment
(1) если я git reset --hard потеряю историю. (2) как объяснено, тайник не работает. Это подробно объяснено в связанном вопросе. Что касается того, что я имею в виду под потерей истории, я имею в виду, что я теряю коммиты, ведущие к настоящему.   -  person Nero gris    schedule 10.08.2018
comment
Почему бы вам просто временно не отключить драйвер фильтра и вручную смазать/очистить рабочее дерево для перебазирования?   -  person user3188445    schedule 10.08.2018
comment
Я на самом деле пытаюсь это сделать прямо сейчас, однако это не очень хорошо. Я должен упомянуть об этом.   -  person Nero gris    schedule 10.08.2018
comment
Я никогда не делал этого сам (я нахожу чистые и размазанные фильтры глубоко оскорбительными для моего VCS, который должен сохранять ваши биты неизмененными чувствами -)), но я, вероятно, тоже использовал бы подход @user3188445.   -  person torek    schedule 10.08.2018
comment
@Torek Это то, к чему я пытаюсь, но по какой-то причине Git мне не нравится, хотя он не совсем потерпел неудачу. Это еще не удалось и не удалось. Что касается того, почему я это делаю, файлы LaTeX, поэтому у меня есть длинные строки, которые я хочу разбить, чтобы в каждой строке было одно предложение. Git (и другие системы контроля версий) не могут правильно различать/объединять файлы, когда они имеют такую ​​структуру.   -  person Nero gris    schedule 10.08.2018
comment
Ах. Да, здесь нужен другой драйвер слияния (который действительно понимает LaTeX). Но это намного сложнее, чем хакерство с фильтрами...   -  person torek    schedule 10.08.2018
comment
Однако это не просто слияние, это также дельта-сжатие. Я получаю лучшее дельта-сжатие, когда Git не выбрасывает каждую строку каждый раз, когда я что-то печатаю. Это делает сценарий autoGit, который я написал (при записи, если последний коммит был 60 секунд назад, он фиксируется и отправляет каждые 30-40 минут в зависимости от количества ожидающих коммитов) практичным. Кроме того, с этими фильтрами не требуется настраиваемый драйвер слияния (хотя это желательно по другой причине: я хочу, чтобы все слияния были помечены как конфликтующие). Ему не нужно понимать LaTeX, или это было результатом моих тестов до применения этих фильтров на практике.   -  person Nero gris    schedule 10.08.2018


Ответы (1)


Ответ заключался в том, чтобы отключить фильтры, а затем применить фильтры вручную при перебазировании. Как я уже упоминал в комментариях, была небольшая загвоздка. Эта загвоздка заключалась в том, что это приводило к пустым коммитам. Решением было удалить фиксацию, поскольку она была автоматической фиксацией, в первую очередь, что также является причиной того, что фильтр не применялся.

Дальнейшая информация

В ~/.bashrc у меня есть путь загрузки, определенный для написанной мной библиотеки, которая используется сценариями фильтрации. Проблема заключалась в том, что сценарий автоматической фиксации git обходил эту переменную среды, что приводило к сбою сценария очистки. Решением этого было явное указание пути к библиотеке в скрипте.

person Nero gris    schedule 10.08.2018