specific - git squash all commits
¿Cómo ejecuto git rebase--interactive de manera no interactiva? (7)
Añadiendo a la respuesta de @ pfalcon, puedes usar sed como tu GIT_SEQUENCE_EDITOR. Por ejemplo, quería editar cada confirmación, así que hice esto:
GIT_SEQUENCE_EDITOR="sed -i -re ''s/^pick /e /''" git rebase -i
¿Es posible hacer lo siguiente?
- Haga
git rebase --interactive
para simplementegit rebase --interactive
estándar en un archivo, en lugar de enviar a un archivo y abrirlo en el editor. - Permita que el usuario edite el archivo.
- Deje que el usuario vuelva a ejecutar
git rebase
con el nombre del archivo editado. - Continúa con el proceso habitual de rebase.
Uso: rebase por script, por supuesto. Vea cómo reordenar commits en Git de forma no interactiva, por ejemplo.
Ampliando la respuesta de pfalcon:
Ejecute
GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
.<script>
debería aceptar un solo argumento: la ruta al archivo que contiene la lista de confirmación de rebase estándar. El script debe reescribirlo en el lugar y salir. El proceso habitual de rebase ocurre después de eso.
Si tiene una variable de entorno que contiene los contenidos que desea:
GIT_SEQUENCE_EDITOR=''echo "$REBASE_DATA" >'' git rebase -i [<additional params>]
Catting un archivo también funcionaría:
GIT_SEQUENCE_EDITOR=''cat rebase_data_file >'' git rebase -i [<additional params>]
Después de algunas reflexiones e investigaciones, la respuesta resultó ser trivial: git rebase -i
toma el nombre del editor de las conocidas variables de entorno EDITOR / VISUAL, por lo que sobrescribirlo para apuntar a un script no interactivo hace el trabajo.
Sin embargo, EDITOR / VISUAL se aplica indiferentemente a la lista de confirmaciones, mensajes de confirmación al reformular y cualquier otra cosa. Entonces, desde http://git.kernel.org/?p=git/git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd , hay una variable de entorno especial GIT_SEQUENCE_EDITOR que se aplica solo a la lista de confirmaciones.
Por lo tanto, la receta para reordenar o aplanar confirmaciones es:
Ejecutar: GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
. Su <script>
debería aceptar un único argumento: la ruta al archivo que contiene la lista de confirmación de rebase estándar. Debería reescribirlo en el lugar y salir. El proceso habitual de rebase ocurre después de eso.
En base a la respuesta de Jezz , realicé un script agnóstico ( GitReb ) que funciona con revisiones de múltiples argumentos, sintaxis :/<text>
, commit raíz y también hace algunas verificaciones de cordura.
También lo simplifiqué y eliminé la acción t
/ split
y delete
-> drop
conversion que IMO está fuera del alcance de este script.
Puede usar touch
como el editor que tocará el archivo para que aparezca modificado. Por ejemplo
GIT_SEQUENCE_EDITOR=touch git rebase -i [commit]
Para alias, dado baseline
como una etiqueta que quiero refundar contra
git config alias.baseline ''!GIT_SEQUENCE_EDITOR=touch git rebase -i baseline''
El alias funciona en Windows porque el shell que está ejecutando es bash
no cmd
.
Uso esta secuencia de comandos (en adición, permite simplificar la división de compromisos):
#!/bin/bash
ACTION=$1
COMMIT=$(git rev-parse --short $2)
[[ "$COMMIT" ]] || exit 1
CORRECT=
for A in p pick r reword e edit s squash f fixup x exec d delete t split; do
[[ $ACTION == $A ]] && CORRECT=1
done
[[ "$CORRECT" ]] || exit 1
if [[ $ACTION == "delete" || $ACTION == "d" ]]; then
GIT_SEQUENCE_EDITOR="sed -i -e ''/^pick $COMMIT/d''" git rebase -i $COMMIT^^
elif [[ $ACTION == "split" || $ACTION == "t" ]]; then
GIT_SEQUENCE_EDITOR="sed -i -e ''s/^pick $COMMIT/edit $COMMIT/''" git rebase -i $COMMIT^^ || exit 1
git reset --soft HEAD^
echo "Hints:"
echo " Select files to be commited using ''git reset'', ''git add'' or ''git add -p''"
echo " Commit using ''git commit -c $COMMIT''"
echo " Finish with ''git rebase --continue''"
else
GIT_SEQUENCE_EDITOR="sed -i -e ''s/^pick $COMMIT/$1 $COMMIT/''" git rebase -i $COMMIT^^
fi
Agregue un alias a su .gitconfig:
[alias]
autorebase = ! path_to_your_script
los modos interactivos abren el editor de conjuntos para trabajar.
el editor en uso se puede recuperar con:
git config --get core.editor
Por lo tanto, si configura un editor no interactivo , es decir, un editor que acepta comandos en stdin, puede trabajar con --interactive
de una manera no interactiva :)
Sé con certeza que vim
acepta comandos, y también el editor estándar ed
, por supuesto.
entonces, sostenga el editor interactivo (si lo desea)
$ ied="$(git config --get core.editor)"
establecer el editor no interactivo
$ git config --unset-all core.editor
$ git config --add core.editor ed
y trabaja con eso ...
$ printf ''%s/n'' "some-ed-cmd" "another-ed-cmd" "wq" | git rebase -i HEAD~5
y restaurar el editor (si se quiere)
$ git config --unset-all core.editor
$ git config --add core.editor "$ied"