2008-12-15 6 views
45

Je dois faire quelques validations en utilisant Git mais je voudrais que l'horodatage de git-log soit dans le futur.git commit - paramétrer l'horodatage dans le futur

Comment faire un commit dans git qui provoque un futur horodatage à enregistrer dans le git-log?

+0

Avez-vous essayé de changer votre horloge? =) Je pense que cela devrait fonctionner localement, mais je ne sais pas ce qu'il se passera quand les autres vont fusionner. – Kieveli

+3

Les horodatages ne sont pas pertinents pour les fusions. – Dustin

Répondre

67

Vous devriez attendre un peu.

Ou vous pouvez faire ceci:

/tmp/x 604% env GIT_AUTHOR_DATE='Wed Dec 19 15:14:05 2029 -0800' git commit -m 'future!' 
[master]: created 6348548: "Future!" 
1 files changed, 1 insertions(+), 0 deletions(-) 

/tmp/x 605% git log 

Author: Dustin Sallings <[email protected]> 
Date: Wed Dec 19 15:14:05 2029 -0800 

    Future! 

Remarque qu'il ya à la fois une date d'auteur et une date de committers, alors assurez-vous de mettre la bonne (ou les deux).

+7

Il fonctionne également avec le format de date ISO 8601: "2029-12-19 15:14:05 -0800". J'aime ça. – sunny256

+2

Quelle est la différence entre GIT_AUTHOR_DATE et GIT_COMMITTER_DATE? – Blago

+4

@Blago: En git, l'auteur (personne qui a écrit le changement) et le committer (personne qui a mis la modification dans le référentiel) sont suivis séparément. Vous permet de faire toutes sortes de bonnes choses. – Dustin

-5

Puis-je vous demander pourquoi vous voudriez faire cela? Si vous ne voulez pas changer votre horloge, je suggère de créer un script pour faire la validation et utiliser le planificateur Windows (ou tout autre équivalent pour votre système d'exploitation) pour exécuter le script au moment où vous voulez que le commit être.

+1

Bonne idée. Dans les systèmes Unix, vous pouvez utiliser la commande "at" (voir "man at" pour l'utilisation). –

10

Si vous souhaitez conserver un changement date réelle lors de l'ajout d'un projet à git, vous pouvez le faire avec

env GIT_AUTHOR_DATE="`ls -rt *.cpp|tail -1|xargs date -u -r`" git commit -m "Old sources retaining old change-dates of last changed 
file: `ls -rt *.cpp|tail -1`, actual commit date: `date`" 

Cela validera avec le changement date de la dernière-changed * .cpp- fichier, et un bon message d'explication de la date de validation réelle.

48

Vous pouvez modifier le commit, par exemple à l'année 2037:

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

J'ai essayé l'année 2038 aussi, mais ensuite je me suis un nulle valeur pour la date.

+11

Jusqu'au 19 janvier 3:14:07 2038 UTC devrait fonctionner. http://en.wikipedia.org/wiki/Year_2038_problem – Arrowmaster

+0

La modification d'une validation ne change que la date de l'auteur. Git suit 2 dates: date de validation et d'auteur.La date de l'auteur restera la version originale via modify ou toute autre commande git qui édite les validations (par exemple: rebase et cerise-pick). – Zombies

+0

@Zombies faux: 'git log' montre' GIT_AUTHOR_DATE' par défaut, pas 'GIT_COMMITTER_DATE'. Vous pouvez vérifier avec 'git log --pretty = fuller' qui montre les deux. La modification du commit avec l'option '--date' change la date _author. La modifier sans cette option ne change que la _commit date_, car elle recrée la validation. – Tim

2

En combinant la réponse de Hugo (1) avec des informations trouvées ici (2) et ballottée dans certains sed, je suis arrivé ceci:

alias newest="find . -path ./.git -prune -o -type f -exec stat -c \"%y %n\" '{}' + | sort -r | head -1 | sed s#'.*\./'##" 
GIT_AUTHOR_DATE="$(newest | xargs date -u -r)" GIT_COMMITTER_DATE="$(newest | xargs date -u -r)" git commit -m "Old sources retaining old change-dates of last changed file: $(newest), actual commit date: $(date)" 

La principale différence est que cette version fait une recherche récursive, donc vous obtenez le dernier fichier n'importe où dans l'arborescence - bien qu'il ignore le répertoire .git, intentionnellement. Vous pouvez, bien sûr, vouloir supprimer une des variables de date ici, et j'utilise une version assez récente de bash (4.2.37 (1) -release), donc la notation $() pourrait ne pas fonctionner pour vous (il suffit de le remplacer par des backticks (`) à la place).

+0

votre 'plus récent | xargs date -u -r' meurt sur les espaces du nom de fichier. sed dans le repo de la FSF supporte les lignes à terminaison nulle et cela rendrait le pipeline entier sûr, mais jusque-là, je dirais d'utiliser -d \\ n quand xarg'e les noms de fichiers. . . . 'trouver. -name .git -prune -o -type d -o -print0 | xargs -0 ls -dt | sed q' est plus courte – jthill

Questions connexes