[Это улучшение ответа Торека , который был отклонен как правка.]
Возможно использовать git ls-files --stage
и git update-index --index-info
для выгрузки и добавления в индекс, соответственно, в одном и том же текстовом формате.
Формат описан в git-update-index
(1) :
mode SP sha1 SP stage TAB path
Этот формат <...> соответствует выводу git ls-files --stage.
Используется поле "stage"представлять конфликтующее слияние в индексе.Если не происходит слияние, оно всегда будет равно 0
.
Обратите внимание, что git update-index
добавляется только к индексу.Чтобы заменить содержимое индекса, его можно очистить перед обновлением или, скорее, записать в другой файл индекса, чтобы избежать любых видов скачков данных, вызванных чтением и обновлением / удалением одного и того же файла в одном и том же конвейере.
Помещение этого в однострочник будет выглядеть довольно грязно, поэтому мы напишем пользовательскую команду Git git-replace-index
:
#!/bin/sh -e
: ${GIT_DIR:="$(git rev-parse --git-dir)"}
: ${GIT_INDEX_FILE:="$GIT_DIR/index"}
GIT_INDEX_NEW="$GIT_INDEX_FILE.new"
GIT_INDEX_FILE="$GIT_INDEX_NEW" git update-index "$@"
rm -f "$GIT_INDEX_FILE"
if [ -e "$GIT_INDEX_NEW" ]; then
mv "$GIT_INDEX_NEW" "$GIT_INDEX_FILE"
fi
С этим помощником результирующий конвейер будет иметь вид:
git ls-files --stage | ... | git replace-index --index-info