2016-05-11 10 views
0

So bin ich ziemlich neu in Git. In erster Linie nutze ich Sourcetree als visuelle Hilfe. In einer Reihe von Projekten wollte ich seit einem bestimmten Datum eine Liste von Dateien und deren aktuellstes Änderungsdatum erhalten.Wie bekomme ich eine Liste von Dateinamen und zuletzt geänderten Daten von Git

Ich sehe, dass ich "git diff --name-only" von der Kommandozeile verwenden kann, aber vermutlich kann ich etwas anderes als (-only) bekommen und dies scheint gegen ein einzelnes Projekt zu sein.

Also was ich suche ist nicht auf einzelne Projekte bezogen wie die Frage here sondern ich versuche, eine Überprüfung über aktive Projekte zu bekommen, so dass ich sehen kann, wo der Fokus für Energie war, die auf mehrere unvollständige hoc Projekte. Ich weiß, dass Ad-Hoc für einige ein schmutziges Szenario ist, aber diese Situation wird sich wahrscheinlich nicht bald ändern und ist keine Entwicklungsentscheidung, die ich getroffen habe, sondern die Realität einer andauernden Geschäftssituation.

Also als Antwort auf @torek unten, habe ich mehrere, einfache, weitgehend unverknochtete Klone, die gemeinsame Quellbibliotheken verwenden. Ich möchte diese bei Bedarf manuell in eine MasterLibraryRepo (eine Sammlung einzelner Quellcode-Bibliotheken) zusammenführen und brauche einen schnellen Weg, um zu überprüfen, wo ich meine Bemühungen konzentrieren sollte.

  • ProjectA.LibA LastCommitDate
  • ProjectA.LibB LastCommitDate
  • ProjectB.LibF LastCommitDate
  • ProjectZ.LibQ LastChnageDate

etc

+0

Mögliches Duplikat von [Git: Wie listet man alle Dateien unter Versionskontrolle zusammen mit ihrem Autorendatum auf?] (Http: // stackoverflow.com/questions/19166483/git-how-to-liste-all-files-unter-version-control-along-with-the-author-date) – jthill

Antwort

0

(möglicherweise Datei Liba MasterLibRepo usw. ändern) Editieren bezüglich Fragen-Editieren: Git hat keine eingebaute Möglichkeit mehrere Projekte zu bearbeiten. Sie könnten ein Repository des eigenen mit mehreren Fernbedienungen machen, und erhalten (in diesem Repository) N separaten Diagramm Subsets begehen und somit N getrennte git diff s auf einem einzigen Repo statt einer git diff auf N separaten repos laufen, aber es ist nicht klar, dass du viel davon gewinnen würdest.


TL; DR Antwort:git log -1 --pretty=format:%cd $sha..HEAD -- <filename> versuchen, einmal für jeden interessanten <filename> und Ihren Ausgang Hash $sha verwenden. Aber siehe unten für zahlreiche Vorbehalte.

Möglicherweise müssen Sie das Problem zuerst genauer definieren. Hier ist ein Beispiel dafür. Beachten Sie, dass ich davon ausgehe, dass das "Änderungsdatum" einer Datei wirklich "das Datum ist, das einem Commit beigefügt ist, wobei dieses Commit die Datei in Bezug auf das von Ihnen identifizierte Start-Point-Commit ändert".

Angenommen, wir haben die Kurve folgende begehen:

   C--D--G--H  <-- xyz-branch 
      / \ 
...--o--S--A--B--E---F--I--J <-- etc-branch 

Hier begehen S ist unsere gewählten Startpunkt begehen (die Sie für die Suche nach gepflückt „modified since“ Fälle). Nehmen wir an, es gibt 30 Dateien in diesem Commit und Commit A ist das gleiche wie S mit der Ausnahme, dass die Datei a.a geändert wurde (so Commit A hat die 29 identische Dateien und eine andere, nämlich a.a).

Nun, wenn a.a in jedem nachfolgenden Commit völlig unverändert ist, ist offensichtlich das Datum, das wir für a.a wollen, der Autor oder das Committer-Datum, die an commit A angehängt sind. Wenn diese Datei jedoch auch im Commit J geändert wird, möchten Sie wahrscheinlich das Datum, das an J angehängt ist.

Aber was passiert, wenn die Datei a.a in commit H geändert wird? Sowohl H als auch J sind Abkömmlinge von A: welche sollten wir als "last modified" auswählen? Wenn Sie einen bestimmten Zielzweig wie xyz-branch haben, dann wäre der neueste H, nicht J, auch wenn das Datum (die Daten) auf J neuer sind, da commit J nur auf etc-branch ist. Wenn der spezifische Zweig etc-branch ist, dann interessieren wir uns für J und nicht H.

Auch mit diesem (etc-branch) Einschränkung, obwohl, wenn a.a sowohl modifiziert wird in C und E, können Sie eine Strategie benötigen eine dieser zu holen, es sei denn Sie diese Änderungen zuweisen möchten F zu begehen. F ist ein Merge-Commit und nimmt daher Änderungen von beiden Seiten der Verzweigung auf - aber einige Git-Befehle, insbesondere git log und git rev-list, tendieren dazu, in verschiedenen Fällen F zu überspringen, was sie möglicherweise vor Ihrem Scan verbergen könnte. Dies kann wiederum das sein, was Sie wollen: Sie sollten Merge-Commits ignorieren und sich nur auf die Nicht-Merges konzentrieren, die im Normalfall die Quelle aller Änderungen sind, die in den Merge eingebracht werden.

Sie müssen auch entscheiden, was es bedeutet, wenn einige Commit löscht a.a vollständig. Ist das eine Veränderung? Was passiert, wenn ein nachfolgendes Commit a.a wiederherstellt? Was ist, wenn es auf einer "Seite" der internen Verzweigung geändert wird (z. B. commit C) und dann zurück geändert wird (z. B. in oder F)?

(ich kann nicht erraten, was Sie wollen,. Sie werden auf diese Dinge zu entscheiden haben, sich selbst)

Auf jeden Fall ist es erwähnenswert, dass git diff einfach zwei Commits vergleicht paarweise. Wenn Sie beispielsweise git diff --name-status etc-branch~6 etc-branch ausführen, vergleicht Git das Commit S mit dem Commit J. (S kommen von etc-branch~6:.. Zurüzählen sechs erst Eltern Ich gehe davon aus, dass der erste Elternteil merge FE hier begehen wird, obwohl es unmöglich ist, aus dieser Grafik Zeichnung zu sagen, ob der erste Elternteil F tatsächlich D ist eher als E, vergleicht diese A begehen gegen F stattdessen begehen) Dies sagt Ihnen, was S-J geändert wird, aber nichts über , wie es auf diese Weise bekam. Sie a.a geändert sehen, aber Sie wissen nicht, ob es in B geändert wurde, E und/oder I, oder vielleicht sogar in I gelöscht und in J wieder auferstehen, für Instanc e.

Je nachdem, welche Arten von Einschränkungen Sie wünschen, gibt es eine relativ schnelle Möglichkeit, Commits zu finden, die eine bestimmte Datei berührt haben. Die Befehle git log und git rev-list - dies sind fast die gleichen Befehle und werden von einer einzigen Datei der obersten Ebene implementiert - können dazu dienen, den Festschreibungsverlauf zu "vereinfachen", einschließlich der Filterung aller bis auf einige aufgelistete Dateien.Zum Beispiel, wenn Sie über builtin/log.c wissen wollen (was sowohl git log und git rev-list implementiert), können Sie ausführen:

git log -p -- builtin/log.c 

die, dass die Datei ändern Commits ausdruckt (darunter auch einige Verschmelzungen) und zeigt dann einen Patch zu sehen was genau in dieser Datei geändert wird (oft zeigt nichts für die gleichen verschmilzt, weil git log -p springt verschmilzt: dieses spezielle Befehl ein bisschen schizoid ist, oder zumindest verwirrt, wollen wir verschmilzt sehen oder nicht ?!):

$ git log --format=short -p -- builtin/log.c | sed 's/@pobox/ pobox/' 
commit cafef3d7ad3ed58d9c976bdeb604cff6b4c1f82b 
Merge: 7c137bb 915c96d 
Author: Junio C Hamano <gitster pobox.com> 

    Merge branch 'lt/pretty-expand-tabs' 

commit 0893eec85fca0f76039a96cbbcd3592ff8571c24 
Author: Junio C Hamano <gitster pobox.com> 

    pretty: enable --expand-tabs by default for selected pretty formats 

diff --git a/builtin/log.c b/builtin/log.c 
index e00cea7..e5775ae 100644 
--- a/builtin/log.c 
+++ b/builtin/log.c 
@@ -1281,6 +1281,7 @@ int cmd_format_patch(int argc, const char **argv, const ch 
     git_config(git_format_config, NULL); 
     init_revisions(&rev, prefix); 
     rev.commit_format = CMIT_FMT_EMAIL; 
+  rev.expand_tabs_in_log_default = 0; 
     rev.verbose_header = 1; 
     rev.diff = 1; 
     rev.max_parents = 1; 

(Es gibt viel mehr; ich habe es gerade an dieser Stelle abgeschnitten - aber beachte das es protokolliert die Zusammenführung, dann ein nicht-Merge-Commit vor der Zusammenführung angemeldet, Teil zu zeigen, was in der Zusammenführung schließlich ging.)

Mit --pretty=format:... oder --format=... und das Überspringen -p, die Sie gerade den Autor oder Committer Datum von git log bekommen . Dies beinhaltet Zusammenführungen. Um sie zu überspringen, fügen Sie --no-merges hinzu. Um den Bereich der geprüften Commits zu begrenzen, fügen Sie Ihren Start- und Endpunkt hinzu, wobei es sich vermutlich um Ihren gewählten Hash handelt ($sha in der Antwort in einer Zeile) und HEAD. Fügen Sie -1 hinzu (das ist eine Ziffer), damit Git nach dem Drucken von nur einem Commit stoppt. Der ausgewählte und gedruckte Commit ist der mit dem neuesten Committer-Datum: git log sortiert immer das, was gedruckt wird, wobei standardmäßig das Committer-Datum verwendet wird. Die Format-Anweisung %cd gibt das Committer-Datum aus.

Wenn Sie den Autor Datum möchten, verwenden Sie %ad statt %cd, aber beachten Sie, dass Sie wahrscheinlich dann --author-date-order verwenden, auch nach Autor Datum sortieren Git erhalten möchten, anstatt Committer Datum. Diese Sortierung entspricht der Diagrammtopologie, was bedeutet, dass, selbst wenn das Festschreiben J älter ist als das Festschreiben I, Git J vor I sortiert wird. Dies unterscheidet sich von der Standardsortierung (Committer-Datum), die Topologie ignoriert: Es wird Commit I angezeigt, da es neuer ist als J (gut, es wird I angezeigt, solange die betreffende Datei von F zu I geändert wird: beachten Sie, dass der Baum Vergleich gehorcht der Diagrammtopologie, es ist der Sortieren nach Festschreibung Datum Vergleich, der die Topologie ignoriert).

(können Sie verpflichten sich zwingen, Datum Topologie --topo-order indem gehorchen zu sortieren.)


Da diese Formulierung schon sagt, eine Zusammenführung kann Änderungen enthalten, die in keiner ihrer Eltern erscheinen. Solche Zusammenführungen werden manchmal "böse Zusammenführungen" genannt und es kann schwierig sein, Veränderungen zu finden, die auf diese Weise verschoben wurden.

, die unmöglich erscheinen mag, aber stellen wir uns vor, den Computer mit dem Datum Booten auf das nächste Jahr, machen Sie eine verpflichten, Neustart und das Datum zurück zu jetzt und machen eine andere begehen. (Ein Neustart ist eigentlich nicht nötig - er soll nur die Visualisierung vereinfachen.) Das Commit, das wir zuerst gemacht haben, ist neuer als das Commit, das wir gerade gemacht haben, und wird neuer bleiben als jedes neue Commit, bis ein weiteres Jahr vergeht.

+0

danke für die Bereitstellung einer so langatmigen Antwort, aber um ehrlich zu sein, meine Situation ist viel einfacher als die Art von Szenarien, die Sie angesprochen haben. Ich bin in einer einzigen Ad-hoc-Entwickler-Basis. Ich muss mich einfach mit den Treibsanden befassen. Also mehrere Projekte, die sich im JIT-Stil entwickeln. Projiziert fast vollständig einzelne Klone ohne Gabeln. Die Situation ist also ziemlich einfach. Der Grund, warum ich in der Lage sein möchte, die letzten Commits pro Datei zu überprüfen, ist so, dass ich die Add-Ons/Änderungen von Quellcode-Bibliotheksmethoden in freigegebenen Bibliotheksdateien problemlos regelmäßig überprüfen und zusammenführen kann. –

+0

Mit anderen Worten möchte ich nur in der Lage sein, schnell eine Bewertung ProjectA.LibA - LastCommitDate, ProjectB.LibF LastCommitDate etc –

+0

Es klingt wie das, was Sie wollen, ist 'git diff - ', wo '' die Sie begehen zuletzt angeschaut. Wenn Sie 'git fetch' verwenden und dann überprüfen, wären dies' git diff master origin/master' (für alle Dateien, die Ihnen wichtig sind), und wenn Sie fertig sind, 'git merge --ff-only', um Ihren lokalen Namen zu verbessern "Meistern" Sie den Tipp - die meisten Commits, die Sie jetzt überprüft haben. – torek

Verwandte Themen