Как восстановить индекс для разреженной проверки с локальными изменениями?

Как восстановить индекс для разреженной проверки с локальными изменениями?

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

Иногда мой индекс повреждается (обычно причиной этого является интеграция Git в Xcode, но я справлялся с этим разными способами).

Для обычного рабочего дерева это нормально, я просто удаляю файл индекса и git reset, возможно, у меня были некоторые подготовленные изменения, которые возвращаются в неподготовленное состояние, но, как правило, я не теряю ничего важного.

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

Поэтому рекомендуемый способ сброса индекса с разреженной информацией о проверке (т. е. установка флагов skip-worktree) — вызвать git read-tree -mu HEAD, но для этого требуется, чтобы не было неподготовленных изменений. Мне нужно сохранить эти неподготовленные изменения, и я не могу их зафиксировать, проиндексировать или сделать что-то еще, поскольку у меня нет индекса (и, учитывая все «удаленные» файлы, потребуется очень много времени, чтобы просто проверить их, чтобы git мог снова удалить их, как только поймет, что они не находятся в разреженной проверке).

Если бы я был готов потерять свои локальные изменения, я мог бы вместо этого вызвать git read-tree -m --reset HEAD, что работает. Но поскольку цель — сохранить мои незафиксированные изменения, этого на самом деле недостаточно.

решение1

Лучшее решение, которое я нашел на данный момент, — это переместить все мои изменения во временное местоположение, запустить git read-tree -mu HEAD, а затем удалить все файлы, созданные git, и заменить их исходными изменениями.

Это означает, что придется ждать, пока git заново создаст все разреженные файлы извлечения, но, по крайней мере, мне не придется ждать, пока он создаст все остальные файлы в репозитории, которые я не хочу извлекать (что, как правило,многодлиннее).

Связанный контент