Ou juste tous les commits intervenus entre deux dates? Dans SVN, vous pouvez faire quelque chose comme
svn diff -r{date}:{date}
pour le faire! Je n'arrive pas à trouver un équivalent Git à ça.
Plus précisément, je cherche à écrire un script pour envoyer des courriels quotidiens avec tout le code engagé ce jour-là et par qui.
The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it.
Donc, la documentation encourage l'utilisationgit log
au lieu degit whatchanged
; cette dernière commande utilise également l'option --no-merge de git log, donc ils produisent les mêmes résultats.git whatchanged
est obsolète à partir de la dernière version actuelle 2.21.0. Tout ce qui estgit whatchanged
réalisé peut être réaliségit log
et n'est conservé que pour des raisons historiques. Voir les détails git-scm.com/docs/git-whatchanged/2.21.0Les suggestions précédentes présentent quelques inconvénients. En gros, je cherchais quelque chose d'équivalent
cvs diff -D"1 day ago" -D"2010-02-29 11:11"
. En collectant de plus en plus d'informations, j'ai trouvé une solution.Les choses que j'ai essayées:
git whatchanged --since="1 day ago" -p
d' iciMais cela donne une différence pour chaque commit, même s'il y a plusieurs commits dans un fichier. Je sais que "date" est un peu un concept vague dans git , je pensais qu'il devait y avoir un moyen de le faire.
git diff 'master@{1 day ago}..master
donne un avertissementwarning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
et n'affiche pas tous les diffs.git format-patch --since=yesterday --stdout
ne donne rien pour moi.revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1)
fonctionne en quelque sorte, mais semble compliqué et ne se limite pas à la branche actuelle.Finalement:
git diff $(git rev-list -n1 --before="1 day ago" master)
semble fonctionner et une façon par défaut de faire des choses similaires , bien que plus compliquée que je ne le pensais.Curieusement, git-cvsserver ne prend pas en charge "cvs diff -D" (sans cela, il est documenté quelque part).
la source
git rev-list
, ce qui a largement contribué à résoudre le problème très similaire que je voyais.git diff 'master@{1 day ago}..master
syntaxe signifie "vérifier le reflog et déterminer où branchemaster
utilisé pour pointer dans votre référentiel local1 day ago
". Plus précisément, n'utilisera pas l'historique de validation réel de la branche actuellemaster
. C'est très rarement ce que vous voulez vraiment."date" est un concept un peu vague dans git. Un commit aura une date d'auteur qui peut être bien dans le passé avant que quelqu'un ne tire / valide le commit dans son référentiel, aussi le commit peut être rebasé et mis à jour pour être au-dessus d'un commit apparemment plus récent.
Un commit a également une date de commit qui est mise à jour si un commit est rebasé ou modifié de quelque manière que ce soit. Ces commits sont plus susceptibles d'être dans une sorte d'ordre chronologique, mais vous êtes toujours à la merci du committer ayant l'heure correcte définie sur son ordinateur et même ainsi, un commit non modifié peut rester indéfiniment sur une branche de fonctionnalité d'un référentiel distant avant fusionné dans la branche maître d'un référentiel central.
Ce qui est probablement le plus utile à vos fins est la date de reflog sur le référentiel particulier en question. Si vous avez activé les reflogs par branche (voir
git config core.logAllRefUpdates
), vous pouvez utiliser leref@{date}
syntaxe pour faire référence à l'emplacement d'une branche à un moment donné.Par exemple
Vous pouvez également utiliser des descriptions `` floues '' comme:
Ces commandes afficheront tous les commits qui sont «apparus» dans la branche donnée du référentiel quel que soit leur «âge» en fonction de leur auteur et des dates de livraison.
Notez que le reflog par branche est spécifique à un référentiel, donc si vous exécutez la commande log sur un clone et que vous ne tirez pas pendant (disons) un mois, puis extrayez toutes les modifications du mois dernier en une seule fois, puis toutes les modifications du mois dernier apparaîtront dans une
@{1 hour ago}..@{now}
plage. Si vous êtes en mesure d'exécuter la commande log sur le répertoire «central» vers lequel les gens poussent, alors il peut faire ce que vous voulez.la source
@{time spec}
syntaxe fait toujours référence à votre reflog local . Il ne fait pas référence à l'historique de validation réel (DAG). Si vous ne comprenez pas la différence, n'utilisez pas cette syntaxe!ou
la source
@{time spec}
syntaxe fait toujours référence à votre reflog local . Il ne fait pas référence à l'historique de validation réel (DAG). Si vous ne comprenez pas la différence, n'utilisez pas cette syntaxe!Peut-être
est ce que vous voulez (avec ou sans '--stdout')?
la source
Je pense que la solution générale est d'utiliser:
Sans --first-parent, vous pourriez obtenir un commit d'une branche qui a ensuite été fusionnée
a ref
mais qui n'a pas été fusionnée depuisa date string
.Voici une alternative utilisant
--children
etgrep
au lieu de-n1
:Je n'étais pas familier avec
git whatchanged
avant de lire ce Q&R, mais il donne des résultats très différents pour moi, donc je ne suis pas sûr de ce que cela fait.la source
Un autre moyen simple d'obtenir une différence de tous les changements depuis une certaine date consiste simplement à trouver le premier commit
X
qui s'est produit à cette date ou après, puis à utiliserCela présente l'avantage de ne pas dépendre des entrées de reflog dans un nouveau clone, contrairement au
solutions dans
la source
Pour observer les changements de fichiers Git de date en date sur votre branche, utilisez la formule suivante:
Formule :
Faites attention à ce que les dates soient au format AAAA-MM-JJ :
Si vous souhaitez observer les changements sur un fichier spécifique dans une plage de temps spécifique (regardez les différences dans le code), naviguez simplement dans le fichier actuel:
Exemple :
la source
C'est plus une réponse amusante, car il existe probablement une meilleure solution. Cela affichera tous les hachages de validation pour aujourd'hui.
; ·)
la source
Vous pouvez également utiliser git-format-patch pour préparer des correctifs (diffs) et les envoyer par e-mail.
Utilisez les options [depuis] ou [plage de révision] pour spécifier la plage de validation.
la source
Je vais vous expliquer comment je le fais:
git log
car une date vous donne des hachages de validation pour la branche actuelle. Ensuite, j'utilise simplement quelque chose commegit diff 8fgdfg8..565k4l5
qui me donne une différence appropriée agrégée par fichiers. J'espère que cela aide, mais pas beaucoup testéla source