Cambiar el post de confirmación para una confirmación específica

Nota: pregunta similar a esta , pero con algunos cambios importantes.

Tengo la siguiente function para reescribir la date de una confirmación, dada la identificación de confirmación:

rewrite-commit-date () { local commit="$1" local newdate="$2" newdate="$(date -R --date "$newdate")" echo ">>>> Rewriting commit $commit date: $newdate" git filter-branch --env-filter \ "if test \$GIT_COMMIT = '$commit' then export GIT_AUTHOR_DATE export GIT_COMMITTER_DATE GIT_AUTHOR_DATE='$newdate' GIT_COMMITTER_DATE='$newdate' fi" && rm -fr "$(git rev-parse --git-dir)/refs/original/" } 

Estoy tratando de implementar una function similar rewrite-commit-message para cambiar el post de confirmación. Lo que quiero es:

  1. La function rewrite-commit-message acepta dos parameters: commit_id y new_commit_message
  2. No es necesario conocer el post de compromiso anterior: tener el commit_id es suficiente para saber qué compromiso cambiar
  3. Sin git commit --amend , ya que esto está relacionado con commits antiguos (no necesariamente con el commit más reciente)
  4. No se preocupe por la reescritura de la historia y el repository maestro: estoy trabajando en una twig de características, y estoy autorizado a hacer git push -f
  5. Me gustaría utilizar filter-branch para esto, pero no estoy seguro de cómo:
    • aplicar el cambio a una confirmación específica: la test utilizada en la function rewrite-commit-date se usa en env-filter , pero no voy a hacer env-filter aquí, ya que no quiero cambiar nada relacionado con la confirmación entorno, pero el post de compromiso.
    • cómo forzar un post de compromiso? El --msg-filter necesita el post de confirmación original. No me importa el post de compromiso original. ¿Hay un --force-msg-filter o similar?

Lo que estoy buscando es similar a esto , pero con algunas advertencias:

  1. No aplique el cambio a un range de confirmaciones, sino a un compromiso específico
  2. No me importa el post de compromiso original, ya que quiero sobrescribirlo por completo

Este pequeño script funciona teniendo en count las siguientes advertencias:

  1. Esto reescribirá tu historial desde el compromiso hasta la punta de la sucursal. Como indicó en la pregunta que esto no es un problema, entonces esto califica.

  2. Tu confirmación está contenida en la twig master . Puede cambiar esto fácilmente pasando el nombre de la twig como otro parámetro, pero ese compromiso será mejor en la twig. Probablemente deberías build alguna validation para esto, quizás usando git rev-parse --abbrev-ref HEAD o tal vez git branch --all --contains <commit>

Sin más preámbulos:

 #!/bin/bash change-commit-msg(){ commit="$1" newmsg="$2" branch="master" git checkout $commit git commit --amend -m "$newmsg" git cherry-pick $commit..$branch git branch -f $branch git checkout $branch } 

Manifestación

 git init echo init > a && git add . && git commit -m "init" echo another > a && git commit -am "another" echo lastly > a && git commit -am "lastly" git log --graph --oneline --all --decorate 
 * bca608c (HEAD -> master) lastly * 4577ab5 another * b3d018c init 
 change-commit-msg 4577ab5 "something else" 
 * c7d03bb (HEAD -> master) lastly * 3ec2c3e something else * b3d018c init