wake-up-neo.com

Wie kann ich den Unterschied zwischen allen Commits ermitteln, die zwischen zwei Daten mit Git aufgetreten sind?

Oder einfach alle Commits, die zwischen zwei Daten stattgefunden haben? In SVN könnte man sowas machen

svn diff -r{date}:{date}

es zu tun! Ich kann anscheinend kein Git-Äquivalent dazu finden.

Konkret möchte ich ein Skript schreiben, um täglich E-Mails mit dem gesamten Code zu versenden, der an diesem Tag festgeschrieben wurde, und von wem.

109
Chris

Du könntest benutzen git whatchanged --since="1 day ago" -p

Es dauert auch ein --until Streit.

Docs

155
seth

Die vorhergehenden Vorschläge haben einige Nachteile. Grundsätzlich habe ich nach etwas gesucht, das cvs diff -D"1 day ago" -D"2010-02-29 11:11" Entspricht. Während ich immer mehr Informationen sammelte, fand ich eine Lösung.

Dinge, die ich versucht habe:

  • git whatchanged --since="1 day ago" -p Von hier

    Dies ergibt jedoch einen Unterschied für jedes Commit, selbst wenn eine Datei mehrere Commits enthält. Ich weiß, dass "date" ist ein bisschen ein loser Begriff in git , ich dachte, es muss einen Weg geben, dies zu tun.

  • git diff '[email protected]{1 day ago}..master Gibt eine Warnung aus warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100. Und zeigt nicht alle Unterschiede an.

  • git format-patch --since=yesterday --stdout Gibt nichts für mich.

  • revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1) funktioniert irgendwie, scheint aber kompliziert zu sein und beschränkt sich nicht auf den aktuellen Zweig.

Endlich:

Komischerweise unterstützt git-cvsserver "cvs diff -D" nicht (ohne dass es irgendwo dokumentiert ist).

58
Weidenrinde

"date" ist ein bisschen ein loser Begriff in git. Ein Commit hat ein Autorendatum, das einige Zeit in der Vergangenheit liegen kann, bevor jemand das Commit tatsächlich in sein Repository abruft/festschreibt. Außerdem kann das Commit neu basiert und aktualisiert werden, um auf einem anscheinend neueren Commit zu stehen.

Ein Commit hat auch ein Commit-Datum, das aktualisiert wird, wenn ein Commit auf irgendeine Weise neu basiert oder geändert wird. Es ist wahrscheinlicher, dass sich diese Commits in einer chronologischen Reihenfolge befinden, aber Sie sind immer noch der Gnade des Committers ausgeliefert, der die richtige Zeit auf seinem Computer eingestellt hat, und trotzdem kann ein nicht modifiziertes Commit auf unbestimmte Zeit in einem Feature-Zweig in einem Remote-Repository gespeichert werden in der Hauptniederlassung eines zentralen Repositorys zusammengeführt werden.

Was für Ihre Zwecke wahrscheinlich am nützlichsten ist, ist das Wiederherstellungsdatum für das betreffende Repository. Wenn Sie Reflogs pro Zweig aktiviert haben (siehe git config core.logAllRefUpdates) dann kannst du das [email protected]{date}-Syntax, die angibt, wo sich eine Verzweigung zu einem bestimmten Zeitpunkt befand.

Z.B.

git log -p [email protected]{2009-07-01}[email protected]{now}

Sie können auch unscharfe Beschreibungen verwenden, z.

git log -p "[email protected]{1 month ago}[email protected]{yesterday}"

Mit diesen Befehlen werden alle Festschreibungen angezeigt, die im angegebenen Zweig des Repositorys "aufgetreten" sind, unabhängig davon, wie "alt" sie laut Autor und Festschreibungsdatum tatsächlich sind.

Beachten Sie, dass das Reflog pro Zweig für ein Repository spezifisch ist. Wenn Sie also den Befehl log auf einem Klon ausführen und nicht etwa einen Monat lang ziehen, ziehen Sie alle Änderungen für den letzten Monat auf einmal. dann erscheinen alle Änderungen des letzten Monats in einem @{1 hour ago}[email protected]{now} Reichweite. Wenn Sie in der Lage sind, den Befehl log in dem 'zentralen' Repostory auszuführen, zu dem die Push-Funktion ausgeführt wird, wird möglicherweise das ausgeführt, was Sie möchten.

21
CB Bailey
git diff --stat @{2013-11-01}[email protected]{2013-11-30}

oder

git diff --stat @{2.weeks.ago}[email protected]{last.week}
14
AA.

Vielleicht

$ git format-patch --committer=<who> --since=yesterday --stdout

ist was du willst (mit oder ohne '--stdout')?

4
Jakub Narębski

Ich glaube, die allgemeine Lösung lautet:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

Ohne --first-parent erhalten Sie möglicherweise ein Commit von einem Zweig, der später in a ref Zusammengeführt wurde, aber seit a date string Nicht mehr zusammengeführt wurde.

Hier ist eine Alternative mit --children Und grep anstelle von -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 ' '
}

Ich war mit git whatchanged Nicht vertraut, bevor ich diese Fragen und Antworten gelesen habe, aber es gibt sehr unterschiedliche Ergebnisse für mich, so dass ich nicht sicher bin, was es tut.

3
Matt McClure

Eine andere einfache Möglichkeit, alle Änderungen seit einem bestimmten Datum anzuzeigen, besteht darin, einfach das erste Commit X zu finden, das an oder nach diesem Datum stattgefunden hat, und dann zu verwenden

git diff X

Dies hat den Vorteil, dass es im Gegensatz zum nicht von Reflog-Einträgen in einem frischen Klon abhängt

git diff <reference>@{n}..
git log <reference>@{n}..

lösungen in

3
user456814

Sie können auch Git-Format-Patch verwenden, um Patches (Diffs) vorzubereiten und per E-Mail zu senden.

Verwenden Sie die Optionen [seit] oder [Revisionsbereich], um den Commit-Bereich festzulegen.

2

Dies ist eher eine lustige Antwort, da es wahrscheinlich einen besseren Weg gibt. Hier werden alle Commit-Hashes für heute angezeigt.

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

; ·)

2
gahooa

Um die Änderungen der Dateien von Datum zu Datum in Ihrem Zweig zu beobachten, verwenden Sie die folgende Formel:

  1. überprüfen Sie Ihre Filiale.
  2. änderungen aus dem Remote-Repository abrufen und aktualisieren
  3. beobachten Sie Diff-Dateien von Datum zu Datumsbereich

beispiel:

git checkout <branch>
git pull
git diff --stat @{fromDate}[email protected]{toDate}

Achten Sie darauf, dass die Daten im Format JJJJ-MM-TT vorliegen:

git diff --stat @{2019-08-20}[email protected]{2019-08-21}

Wenn Sie Änderungen an einer bestimmten Datei in einem bestimmten Zeitbereich (Unterschiede im Code beobachten) beobachten möchten, navigieren Sie einfach durch die aktuelle Datei:

beispiel:

git diff @{2019-01-01}[email protected]{2019-01-02} ~/dev/myApp/package.json
0
avivamg

Ich werfe so, wie ich es mache: git log für ein Datum gibt Ihnen Commit-Hashes für den aktuellen Zweig. Dann benutze ich einfach so etwas wie git diff 8fgdfg8..565k4l5 was mir den richtigen Unterschied gibt, aggregiert nach Dateien. Hoffe, das hilft, aber nicht viel getestet

0
rostamn739