tag specific example crear commits all git scripting git-rebase non-interactive

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?

  1. Haga git rebase --interactive para simplemente git rebase --interactive estándar en un archivo, en lugar de enviar a un archivo y abrirlo en el editor.
  2. Permita que el usuario edite el archivo.
  3. Deje que el usuario vuelva a ejecutar git rebase con el nombre del archivo editado.
  4. 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"