Pregunta

Las respuestas a Cómo modificar las existentes, unpushed comete? describir una forma de modificar los anteriores mensajes de confirmación que aún no han sido empujados aguas arriba.Los nuevos mensajes de heredar la hora de la original se compromete.Esto parece lógico, pero hay una forma de re-establecer los tiempos?

¿Fue útil?

Solución

Uso git filter-branch con un env filtro que establece GIT_AUTHOR_DATE y GIT_COMMITTER_DATE específicamente para el hash del commit usted está buscando para arreglar.

Esto invalidará y que en el futuro todos los hashes.

Ejemplo:

Si usted quiere cambiar el fechas de cometer 119f9ecf58069b265ab22f1f97d2b648faf932e0, usted 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'

Otros consejos

Puede hacer una nueva versió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 escribe, por ejemplo:

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

Luego continúa con su rebase interactivo.

ACTUALIZACIÓN (en respuesta al comentario de studgeek): para cambiar la fecha de confirmación en lugar de la fecha del 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 se prueba en Git Bash.

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á la última confirmación del commit y la fecha del autor en " ahora mismo. "

Acaba de hacer git commit --amend --reset-author --no-edit.Para los mayores, se compromete, usted puede hacer un interactivo de reajuste y elegir edit para la confirmación cuya fecha que desea modificar.

git rebase -i <ref>

Entonces modificar el comprometerse con --reset-author y --no-edit para cambiar la fecha del autor a la fecha actual:

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

Finalmente continuar con su interactivos de reajuste:

git rebase --continue

Escribí un guión y Homebrew de este paquete.Super fácil de instalar, se puede encontrar en GitHub PotatoLabs/git-redate página.

Sintaxis:

git redate -c 3

Usted sólo tiene que ejecutar git redate y usted será capaz de editar todas las fechas en vim de la mayoría de los últimos 5 comete (también hay un -c opción de cómo muchos se compromete quieres ir de nuevo, sólo que por defecto es 5).Déjeme saber si usted tiene alguna pregunta, comentarios o sugerencias!

enter image description here

Cada confirmación está asociada con dos fechas, la fecha de confirmación y la fecha de autor. Puede ver estas fechas con:

git log --format=fuller

Si desea cambiar la fecha del autor y la fecha del confirmador de las últimas 6 confirmaciones, simplemente puede usar una nueva versión interactiva:

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 salga de su editor.

Ahora puede modificar cada confirmación especificando la fecha del autor y la fecha de confirmación 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 del autor.

Luego vaya al siguiente commit con:

git rebase --continue

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

Basándose en theosp 's respuesta , 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 @~ le 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, puede 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 (coreutils) a la fecha especificada.

git cdc @~ "2 days ago"

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


Ilya Semenov menciona en los comentarios :

  

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

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

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

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

si es la última confirmación anterior.

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

si ya empujas al origen y puedes forzar el uso:

git push --force 

si no puede forzar el empuje y si se empuja, ¡no puede cambiar el compromiso! .

Aquí hay un alias conveniente que cambia los tiempos de confirmación y autor del último compromiso a un tiempo aceptado 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

Editar: Aquí hay una versión más automatizada que verifica que el índice esté limpio (sin cambios no confirmados) y reutiliza el último mensaje de confirmación, o falla de otra manera (a prueba de tontos):

[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!"

Creé este paquete npm para cambiar la fecha de las confirmaciones anteriores.

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

Ejemplo de uso:

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 ingrese la nueva fecha.

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

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

Tenga cuidado de no usarlo si ya presionó el commit o si lo usa 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 la fecha del autor y 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"

Si desea obtener la fecha exacta de otra confirmación (supongamos que modificó la edición de una confirmación y desea que tenga la fecha de la versión original anterior):

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

Esto corrige la fecha de confirmación HEAD para que sea exactamente la fecha de confirmación 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 del autor, que es lo que generalmente le interesa: vea otras respuestas para la fecha del confirmador.

Si desea realizar la respuesta aceptada ( https://stackoverflow.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:

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

Muchas gracias, vaya a un publicación de blog de Colin Svingen . Aunque su código no funcionó para mí, me ayudó a encontrar la solución correcta.

Ya hay muchas respuestas excelentes, pero cuando quiero cambiar la fecha de varias confirmaciones en un día o en un mes, no encuentro una respuesta adecuada. Así que creo un nuevo script para esto con 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 cambiará:

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

Si commit aún no se ha enviado, entonces puedo usar algo así: git commit --amend --date = " Mié 25 mar 10:05:44 2020 +0300 & Quot; después de eso, git bash abre el editor con la fecha ya aplicada, por lo que solo debe guardarlo escribiendo en el modo de comando del editor VI ": wq " y puedes empujarlo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top