Если вы можете убедить своего редактора написать версию файла, который вы хотите подготовить, вы можете использовать команды git уровня слесарного дела, чтобы добавить его в индекс под правильным именем. Вам нужно обойти «git add», который всегда будет связывать путь X в рабочем дереве с путем X в индексе (насколько я знаю).
Когда у вас есть содержимое, которое вы хотите записать во временный файл $ tempfile, запустите git hash-object -w $tempfile
- это запишет объект в .git / objects и выведет идентификатор blob. Затем передайте этот идентификатор BLOB-объекта в индекс, используя git update-index --cacheinfo 100644 $blobid $path
, чтобы связать путь $ path с этим объектом.
Вот пример, в котором происходит изменение сценария с именем «post_load» в моем репозитории без перезаписи самого файла (также демонстрируется, что вы можете обойтись без временного файла):
git update-index --cacheinfo 100755 $(perl -lne 'print unless (/^#/)' post_load \
| git hash-object -w --stdin) post_load
Вы не упоминаете, из какого редактора вы планируете делать это, поэтому сложно посоветовать вам, как интегрировать это. Как я уже упоминал, вам нужно как-то представить git вместе с файлом так, как вы хотите, чтобы он был подготовлен (помните, что git не имеет дело с сохранением изменений). Если вы можете написать макрос, чтобы просто сохранить файл как «$ file.tmp», тогда используйте что-то подобное выше git update-index --cacheinfo $the_mode $(git hash-object -w $file.tmp) $file
(получение $ the_mode оставлено в качестве упражнения: p), удалите $ file.tmp и отмените буфер редактора возвращается к $ file, который будет делать то, что вы просите.
Например, следующий скрипт принимает три аргумента: M N path
. Он обновит содержимое индекса для файла по «пути», так что строки от M до N (включительно) будут заменены содержимым из stdin:
#!/bin/sh
start_line=$1
end_line=$2
path=$3
mode=$(git ls-files -s $path | awk '{print $1}')
blob_id=$(
(
head -n $(expr $start_line - 1) $path
cat
tail -n +$(expr $end_line + 1) $path
) | git hash-object -w --stdin
)
exec git update-index --cacheinfo $mode $blob_id $path
например echo "HELLO WORLD" | ./stage-part 8 10 post_load
заменит три строки из 8-10 просто "HELLO WORLD".