tipos tag remove qué existen etiquetas crear git timestamp commit git-rewrite-history

remove - git tag



¿Cómo se puede cambiar la marca de tiempo de un antiguo compromiso en Git? (17)

Aquí hay un alias conveniente que cambia los tiempos de confirmación y de autor de la última confirmación a una hora aceptada por date --date :

[alias] cd = "!d=/"$(date -d /"$1/")/" && shift && GIT_COMMITTER_DATE=/"$d/" / git commit --amend --date /"$d/""

Uso: git cd <date_arg>

Ejemplos:

git cd now # update the last commit time to current time git cd ''1 hour ago'' # set time to 1 hour ago

Edición: Aquí hay una versión más automatizada que verifica que el índice esté limpio (sin cambios no confirmados) y reutilice el último mensaje de confirmación, o falle de otra manera (infalible):

[alias] cd = "!d=/"$(date -d /"$1/")/" && shift && / git diff-index --cached --quiet HEAD --ignore-submodules -- && / GIT_COMMITTER_DATE=/"$d/" git commit --amend -C HEAD --date /"$d/"" / || echo >&2 "error: date change failed: index not clean!"

Las respuestas a ¿Cómo modificar los compromisos existentes, sin pulir? Describe una forma de enmendar los mensajes de confirmación anteriores que aún no se han enviado hacia arriba. Los nuevos mensajes heredan las marcas de tiempo de las confirmaciones originales. Esto parece lógico, pero ¿hay una manera de restablecer también los tiempos?


Cada confirmación está asociada a dos fechas, la fecha de envío y la fecha de autor. Puedes ver estas fechas con:

git log --format=fuller

Si desea cambiar la fecha de autor y la fecha de envío de las últimas 6 confirmaciones, simplemente puede utilizar un rebase interactivo:

git rebase -i HEAD~6

.

pick c95a4b7 Modification 1 pick 1bc0b44 Modification 2 pick de19ad3 Modification 3 pick c110e7e Modification 4 pick 342256c Modification 5 pick 5108205 Modification 6 # Rebase eadedca..5108205 onto eadedca (6 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit''s log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit

Para todas las confirmaciones en las que desea cambiar la fecha, reemplace pick por edit (o simplemente e ), luego guarde y cierre su editor.

Ahora puede modificar cada confirmación especificando la fecha de autor y la fecha de envío en formato ISO-8601:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

La primera fecha es la fecha de confirmación, la segunda es la fecha de autor.

A continuación, vaya a la siguiente confirmación con:

git rebase --continue

Repita el proceso hasta que modifique todos sus compromisos. Comprueba tu progresión con el git status .


Escribí un script y un paquete Homebrew para esto. Súper fácil de instalar, puedes encontrarlo en la página GitHub PotatoLabs/git-redate .

Sintaxis:

git redate -c 3

Solo tiene que ejecutar git redate y podrá editar todas las fechas en el momento de las 5 confirmaciones más recientes (también hay una opción -c para la cantidad de confirmaciones que desea volver, solo la predeterminada es 5). ¡Avísame si tienes alguna pregunta, comentario o sugerencia!


Esto cambia la fecha (marca de tiempo) para la última confirmación

git commit --amend --date "Thu May 28 18:21:46 2015 +0530"


He creado este paquete npm para cambiar la fecha de las confirmaciones antiguas.

https://github.com/bitriddler/git-change-date

Uso de la muestra:

npm install -g git-change-date cd [your-directory] git-change-date

Se le pedirá que elija la confirmación que desea modificar y luego que ingrese la nueva fecha.

Si desea cambiar una confirmación por un hash específico, ejecute este git-change-date --hash=[hash]


La siguiente función de bash cambiará el tiempo de cualquier confirmación en la rama actual.

Tenga cuidado de no usarlo si ya presionó la confirmación o si usa la confirmación en otra rama.

# rewrite_commit_date(commit, date_timestamp) # # !! Commit has to be on the current branch, and only on the current branch !! # # Usage example: # # 1. Set commit 0c935403 date to now: # # rewrite_commit_date 0c935403 # # 2. Set commit 0c935403 date to 1402221655: # # rewrite_commit_date 0c935403 1402221655 # rewrite_commit_date () { local commit="$1" date_timestamp="$2" local date temp_branch="temp-rebasing-branch" local current_branch="$(git rev-parse --abbrev-ref HEAD)" if [[ -z "$date_timestamp" ]]; then date="$(date -R)" else date="$(date -R --date "@$date_timestamp")" fi git checkout -b "$temp_branch" "$commit" GIT_COMMITTER_DATE="$date" git commit --amend --date "$date" git checkout "$current_branch" git rebase "$commit" --onto "$temp_branch" git branch -d "$temp_branch" }


Para cambiar tanto la fecha de autor como la fecha de confirmación:

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"


Puede hacer una reorganización interactiva y elegir editar para la confirmación cuya fecha desea modificar. Cuando el proceso de rebase se detiene para modificar la confirmación que usted escribe, por ejemplo:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"

Luego continúas tu rebase interactivo.

ACTUALIZACIÓN (en respuesta al comentario de studgeek): para cambiar la fecha de confirmación en lugar de la fecha de autor:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend

Las líneas anteriores establecen una variable de entorno GIT_COMMITTER_DATE que se utiliza en la modificación de confirmación.

Todo está probado en Git Bash.


Si desea obtener la fecha exacta de otra confirmación (supongamos que rebautización editó una confirmación y desea que tenga la fecha de la versión original previa a la rebase):

git commit --amend --date="$(git show -s --format=%ai a383243)"

Esto corrige la fecha del compromiso HEAD para que sea exactamente la fecha del compromiso a383243 (incluya más dígitos si hay ambigüedades). También abrirá una ventana de editor para que pueda editar el mensaje de confirmación.

Eso es para la fecha de autor, que es lo que normalmente cuidas: consulta otras respuestas para la fecha de envío.


Si desea realizar la respuesta aceptada ( https://.com/a/454750/72809 ) en la línea de comandos estándar de Windows, necesita el siguiente comando:

git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE=''2009-10-16T16:00+03:00''; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"

Notas:

  • Puede ser posible dividir el comando en varias líneas (Windows admite la división de líneas con el símbolo de la carretilla ^ ), pero no tuve éxito.
  • Puede escribir fechas ISO, ahorrando mucho tiempo buscando el día de la semana correcto y la frustración general sobre el orden de los elementos.
  • Si desea que la fecha Autor y Comisionado sea la misma, solo puede hacer referencia a la variable establecida previamente.

Muchas gracias por ir a un blog de Colin Svingen . Aunque su código no me funcionó, me ayudó a encontrar la solución correcta.


Si es anterior último cometer.

git rebase -i HEAD~2 git commit --amend --date=now

Si ya presionas para orgin y puedes forzar el uso:

git push --force

¡Si no puede forzar el empuje y si es empujado, no puede cambiar el compromiso! .


Simplemente haga git commit --amend --reset-author --no-edit . Para confirmaciones más antiguas, puede hacer una reorganización interactiva y elegir edit para la confirmación cuya fecha desea modificar.

git rebase -i <ref>

Luego --reset-author la confirmación con --reset-author y --no-edit para cambiar la fecha del autor a la fecha actual:

git commit --amend --reset-author --no-edit

Finalmente continúe con su rebase interactivo:

git rebase --continue


Sobre la theosp de la answer theosp , escribí un script llamado git-cdc (para confirmar la fecha de cambio) que puse en mi PATH .

El nombre es importante: git-xxx en cualquier lugar de su PATH permite escribir:

git xxx # here git cdc ...

Ese script está en bash, incluso en Windows (ya que Git lo llamará desde su entorno msys )

#!/bin/bash # commit # date YYYY-mm-dd HH:MM:SS commit="$1" datecal="$2" temp_branch="temp-rebasing-branch" current_branch="$(git rev-parse --abbrev-ref HEAD)" date_timestamp=$(date -d "$datecal" +%s) date_r=$(date -R -d "$datecal") if [[ -z "$commit" ]]; then exit 0 fi git checkout -b "$temp_branch" "$commit" GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r" git checkout "$current_branch" git rebase --autostash --committer-date-is-author-date "$commit" --onto "$temp_branch" git branch -d "$temp_branch"

Con eso, puedes escribir:

git cdc @~ "2014-07-04 20:32:45"

Eso restablecería la fecha de autor / confirmación de la confirmación antes de HEAD ( @~ ) en la fecha especificada.

git cdc @~ "2 days ago"

Eso restablecería la fecha de autor / confirmación de la confirmación antes de HEAD ( @~ ) a la misma hora, pero hace 2 días.

Ilya Semenov menciona en los comentarios :

Para OS X también puede instalar GNU coreutils ( brew install coreutils ), agregarlo a PATH ( PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" ) y luego usar la sintaxis " 2 days ago ".


Una mejor manera de manejar todas estas sugerencias en un comando es

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

Esto establecerá el último compromiso y la fecha de autor en "ahora mismo".


Ya hay muchas respuestas geniales, pero cuando quiero cambiar la fecha para múltiples confirmaciones en un día o en un mes, no encuentro una respuesta adecuada. Así que creo un nuevo guión para esto con una explicación, espero que ayude a alguien:

#!/bin/bash # change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800 # you can change the data_match to change all commits at any date, one day or one month # you can also do the same for GIT_COMMITTER_DATE git filter-branch --force --env-filter '' date_match="^Thu, 14 Sep 2017 13+" # GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format author_data=$GIT_AUTHOR_DATE; author_data=${author_data#@} author_data=${author_data% +0800} # author_data is 1505367581 oneday=$((24*60*60)) # author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format author_data_str=`date -R -d @$author_data` if [[ $author_data_str =~ $date_match ]]; then # remove one day from author_data new_data_sec=$(($author_data-$oneday)) # change to git internal format based on new_data_sec new_data="@$new_data_sec +0800" export GIT_AUTHOR_DATE="$new_data" fi '' --tag-name-filter cat -- --branches --tags

La fecha será cambiada:

AuthorDate: Wed Sep 13 13:39:41 2017 +0800


Use git filter-branch con un filtro env que establezca GIT_AUTHOR_DATE y GIT_COMMITTER_DATE para el hash específico de la confirmación que desea corregir.

Esto invalidará eso y todos los hashes futuros.

Ejemplo:

Si desea cambiar las dates de commit 119f9ecf58069b265ab22f1f97d2b648faf932e0 , puede hacerlo con algo como esto:

git filter-branch --env-filter / ''if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ] then export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800" export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700" fi''


git commit --amend --date="now"