(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 F
E
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.
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