ver tipos tag pendientes modificados log etiquetas crear commits archivos git git-filter-branch

tipos - git ver commits pendientes



Ejecutar filtrar-rama sobre un rango de confirmaciones (8)

Incluya los comandos de filtro en una instrucción if que verifica ese rango. Puede verificar si una confirmación está dentro de un rango determinado con este comando:

git rev-list start..end | grep **fullsha**

La confirmación actual se almacenará en $GIT_COMMIT en su filtro. Entonces tu filtro se convierte en:

git filter-branch --env-filter '' if git rev-list commita..commitb | grep $GIT_COMMIT; then export GIT_AUTHOR_EMAIL="[email protected]" export GIT_AUTHOR_NAME="foo" fi'' -- ^commita --all

Si solo desea reescribir su rama actual, reemplace --all con HEAD

git filter-branch --env-filter '' export GIT_AUTHOR_EMAIL="[email protected]" export GIT_AUTHOR_NAME="foo"'' -- commita..commitb

Resultados en Which ref do you want to rewrite?

Entonces parece que filter-branch no le permite usar la notación de rango use un rango entre dos referencias arbitrarias.

¿Cuál es la forma más directa de ejecutar un filtro sobre un rango de confirmaciones consecutivas (en algún lugar dentro del historial de una sucursal) si este enfoque no es posible?


La solución de @Acron me parece incorrecta. Sugeriría seguir para cambiar entre refa y refb incluyendo ambos valores hash:

  1. git tag master.bak
  2. git reset --hard refa
  3. git filter-branch --env-filter '' export GIT_AUTHOR_EMAIL="[email protected]"'' refa^..master
  4. git cherry-pick refb..master.bak
  5. git tag -d master.bak

La solución más limpia que encontré fue hacer lo siguiente:

  1. Crea una rama temporal en refb .
  2. Aplicar el filtro de rama en refa..temp .
  3. Rebase en la rama temporal y elimínelo.

es decir.

git branch temp refb git filter-branch --env-filter '' export GIT_AUTHOR_EMAIL="[email protected]"'' refa..temp git rebase temp git branch --delete temp


Lo hago de esta manera.

Digamos que desea filtrar el contenido de una rama llamada branch-you-are-filtering.

Supongamos que hay un ancestro comprometido con esa rama, con una referencia llamada ref-for-commit-to-stop-at.

git filter-branch --commit-filter ''YOUR_FILTER_COMMANDS'' branch-you-are-filtering...ref-for-commit-to-stop-at

Después de la ejecución, la confirmación en ref-for-commit-to-stop-at no se verá alterada. Todos los commit / change changed filtrados en branch branch-you-are-filtering se basarán en ref-for-commit-to-stop-at.

Si usted está usando --commit-filter o algo más depende de usted.


No puede anular las confirmaciones en la mitad de un historial, porque sha1 de una confirmación depende de la de un padre. Entonces, el idiota no sabe dónde quieres apuntar tu referencia HEAD después de la filtración. Entonces, debes reescribir todo hasta la CABEZA.

Ejemplo:

A---B---C---D---E---F master / /--G---H branch

si quiere que el filtro confirme B y C, también debe filtrar todas las confirmaciones después de: D, E, F, G, H. Entonces, es por eso que git le dice que use una referencia al final del rango, para que simplemente no termine con una cabeza separada.

Después de modificar los compromisos B y C y detenerse se verá así:

A---B---C---D---E---F master / / / /--G---H branch /-B''--C'' (HEAD or a temporary TAG?..)

Entonces, el master y la branch quedarán intactos. No creo que esto sea lo que quieres. Significa que debes anular todas las confirmaciones. La historia será entonces:

A---B---C---D---E---F (loose end, will be garbage collected one day) / / / /--G---H (loose end, will be garbage collected one day) /-B''--C''--D''--E''--F'' master / /--G''--H'' branch


No puede aplicar la rama de filtro en el medio del historial, como dice @kan. Debe aplicar desde su compromiso conocido hasta el final de la historia

git filter-branch --env-filter ''...'' SHA1..HEAD

Filter-branch puede verificar si el autor de la confirmación u otra información, eligió cambiar o no la confirmación, por lo que hay formas de lograr lo que desea, consulte http://git-scm.com/book/ch6-4.html , busque "Cambiar las direcciones de correo electrónico a nivel mundial"

Recuerde: si ha enviado los commits a un repositorio público, no debería usar el filtro branch


Usa filter-branch''s --setup parm y algo de poder de shell:

git filter-branch --setup '' for id in `git rev-list commitA..commitB`; do eval filterfor_$id=rewrite done rewrite() { GIT_AUTHOR_NAME="Frederick. O. Oosball" [email protected] } '' --env-filter ''eval /$filterfor_$GIT_COMMIT''


git filter-branch acepta la notación de rango, pero el final del rango debe ser una referencia, no el ID de una confirmación.

git checkout -b tofilter commitb git filter-branch .... commita..tofilter

Si se da solo confirma, no sabría qué ref actualizar con la rama filtrada.