Si puede convencer a su editor para que escriba una versión del archivo que desea que se organice, puede usar los comandos de git de nivel de plomería para agregarlo al índice con el nombre correcto. Debe omitir "git add", que siempre asociará la ruta X en el árbol de trabajo con la ruta X en el índice (hasta donde yo sé).
Una vez que tenga el contenido que desea representar en un archivo temporal $ archivo_temporal, ejecute git hash-object -w $tempfile
- esto escribirá el objeto en .git/objects y dará salida a la id de blob. A continuación, introduzca este identificador de blob en el índice usando git update-index --cacheinfo 100644 $blobid $path
para asociar la ruta $ path con ese objeto.
He aquí un ejemplo que pone en escena un cambio a un script llamado "post_load" en mi repo sin sobrescribir el archivo en sí (que demuestra también se puede prescindir de un archivo temporal):
git update-index --cacheinfo 100755 $(perl -lne 'print unless (/^#/)' post_load \
| git hash-object -w --stdin) post_load
Usted no menciona de qué editor está planeando hacer esto, por lo que es difícil aconsejarle sobre cómo integrar esto. Como mencioné, necesitas presentar git de alguna manera como quieras que sea el escenario (recuerda, git no se ocupa de almacenar cambios). Si puede escribir una macro para guardar el archivo como "$ file.tmp", utilice algo como lo anterior en git update-index --cacheinfo $the_mode $(git hash-object -w $file.tmp) $file
(obtener $ the_mode se deja como un ejercicio: p), eliminar $ file.tmp y revertir el buffer del editor Regrese a $ archivo que básicamente haría lo que está pidiendo.
Por ejemplo, el siguiente script toma tres argumentos: M N path
. Se actualizará el contenido de índice para el archivo en "camino" de modo que M líneas a través de N (inclusive) se sustituyen con el contenido de la entrada estándar:
#!/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
por ejemplo echo "HELLO WORLD" | ./stage-part 8 10 post_load
reemplazará las tres líneas de 8-10 con solo "HOLA MUNDO".
¿Qué tan apegado está a la idea de hacer esto desde el editor en lugar de a través de 'git add -i'? Probablemente puedas encontrar algo que pueda llamar '' git diff', sacar los trozos que tocan las líneas que has seleccionado, y aplicar ese parche al índice, si realmente quisieras ... – Cascabel