Comment puis-je obtenir le diff entre tous les commits intervenus entre deux dates avec Git?

Ou seulement tous les commits intervenus entre deux dates? En SVN, vous pourriez faire quelque chose comme

svn diff -r{date}:{date} 

pour le faire! Je n’arrive pas à trouver un équivalent à Git.

Plus précisément, je cherche à écrire un script pour envoyer des emails quotidiens avec tout le code commis ce jour-là et par qui.

Vous pouvez utiliser git whatchanged --since="1 day ago" -p

Il prend également un argument --until .

Docs

Les suggestions précédentes ont des inconvénients. Fondamentalement, 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’ ici

    Mais cela donne un diff pour chaque commit, même s’il y a plusieurs commits dans un fichier. Je sais que “date” est un concept un peu vague en git , j’ai pensé qu’il devait y avoir un moyen de le faire.

  • git diff 'master@{1 day ago}..master émet un avertissement warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100. et ne montre 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 twig actuelle.

Finalement:

  • git diff $(git rev-list -n1 --before="1 day ago" master) semble fonctionner et un moyen par défaut de faire des choses similaires , bien que plus compliqué que je le pensais.

Curieusement, git-cvsserver ne supporte pas “cvs diff -D” (sans que cela soit documenté quelque part).

“date” est un peu un concept lâche dans git. Un commit aura une date d’auteur qui peut avoir du temps dans le passé avant que quelqu’un ne tire / valide le commit dans son repository, aussi le commit peut être rebasé et mis à jour pour s’append à un commit apparemment plus récent.

Une validation a également une date de validation qui est mise à jour si une validation est rebasée ou modifiée de quelque manière que ce soit. Ces commits ont plus de chances de se classer dans un ordre chronologique, mais vous êtes toujours à la merci du committer qui dispose de l’heure correcte sur son ordinateur et, malgré cela, un commit non modifié peut restr indéfiniment sur une twig être fusionné dans la twig principale d’un référentiel central.

Ce qui est probablement le plus utile à vos fins est la date de renvoi sur le référentiel en question. Si les reflections par twig sont activées (voir git config core.logAllRefUpdates ), vous pouvez utiliser la syntaxe ref@{date} pour faire référence à une twig à un moment donné.

Par exemple

 git log -p master@{2009-07-01}..master@{now} 

Vous pouvez également utiliser des descriptions «floues» comme:

 git log -p "master@{1 month ago}..master@{yesterday}" 

Ces commandes afficheront tous les commits qui sont “apparus” dans la twig donnée du référentiel, quel que soit leur âge, en fonction de leur auteur et des dates de validation.

Notez que le reflet par twig est spécifique à un référentiel, donc si vous exécutez la commande de journalisation sur un clone, et que vous ne récupérez pas (disons) un mois, tirez toutes les modifications du dernier mois à la fois, alors tous les changements du mois dernier apparaîtront dans une plage @{1 hour ago}..@{now} . Si vous êtes en mesure d’exécuter la commande de journalisation sur le répertoire “central” vers lequel les utilisateurs accèdent, cela peut faire ce que vous voulez.

 git diff --stat @{2013-11-01}..@{2013-11-30} 

ou

 git diff --stat @{2.weeks.ago}..@{last.week} 

Peut-être

 $ git format-patch --committer= --since=yesterday --stdout 

est ce que tu veux (avec ou sans ‘–stdout’)?

Je crois que la solution générale est d’utiliser:

 git rev-list -n1 --first-parent --until=  

Sans –first-parent, vous pouvez obtenir une validation à partir d’une twig qui a été fusionnée ultérieurement dans a ref mais qui n’a pas été fusionnée à partir d’ a date ssortingng .

Voici une alternative utilisant --children et grep au lieu de -n1 :

 mlm_git_ref_as_of() { # # Examples # # # Show all commits between two dates: # # git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400') # # Show diffs of all commits between two dates: # # git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400') local as_of="$1" local ref="${2:-HEAD}" # Get the most recent commit (--children, grep -v ' ') that was on # the given branch ($ref, --first-parent) as of a given date # ($as_of) git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' ' } 

Je ne connaissais pas bien git whatchanged avant de lire cette Q & R, mais cela donne des résultats très différents pour moi, alors je ne suis pas sûr de ce que ça fait.

Ceci est plus une réponse amusante, car il y a probablement une meilleure façon. Cela montrera tous les hashes pour aujourd’hui.

 git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}` 

; ·)

Vous pouvez également utiliser git-format-patch pour préparer des correctifs (diffs) et les envoyer par courrier électronique.

Utilisez les options [Depuis] ou [Plage de révision] pour spécifier la plage de validation.

Une autre façon simple d’obtenir un diff de toutes les modifications depuis une certaine date est de simplement trouver le premier commit X survenu à cette date ou après, puis d’utiliser

 git diff X 

Cela présente l’avantage de ne pas dépendre des entrées de refusion dans un nouveau clone, contrairement au

 git diff @{n}.. git log @{n}.. 

des solutions dans

Je vais lancer comme je le fais: git log pour une date vous donne des hashes pour la twig en cours. Ensuite, j’utilise juste quelque chose comme git diff 8fgdfg8..565k4l5 qui me donne la différence appropriée agrégée par fichiers. J’espère que cela aide, pas testé bien que