2016-05-09 12 views
1

In git Versionskontrolle, ich möchte herausfinden, wer (was Benutzer) ursprünglich Zeilen des Codes für eine bestimmte Commit festschreibt.Wie finde ich heraus, wer (welcher Benutzer) die gelöschten Codezeilen für einen gegebenen Git-Commit festschreibt?

Wie könnte ich das finden?

Update: Ich möchte dies für viele Git-Commits überprüfen; Daher ist die Verwendung einer grafischen Benutzeroberfläche keine Option. Ich suche nach einem Git-Befehl (oder konsekutiven Befehlen), um diesen Vorgang mit einem Python-Skript zu automatisieren.

+1

Die Person, die die Zeilen in einem Commit gelöscht hat, ist dieselbe Person, die das Commit durchgeführt hat. Ich glaube nicht, dass Sie das fragen. Könnten Sie das klären? – Schwern

+0

Mit einem bestimmten Commit können Sie wissen, welche Codezeile in einem Repository gelöscht oder hinzugefügt wurde. Die gelöschte Codezeile gehört einer anderen Person, die ursprünglich mit einem anderen Commit zum Repository hinzugefügt wurde. Ich möchte diesen Benutzer finden. Ich hoffe, es ist klar genug. –

+0

Wenn ich Sie richtig verstehe, möchten Sie herausfinden, wer ursprünglich eine gerade gelöschte Zeile hinzugefügt hat? – Schwern

Antwort

1

Sie können von git Schuld machen: https://git-scm.com/docs/git-blame

git blame akzeptiert eine Datei und annotiert jede Zeile in der angegebenen Datei mit Informationen aus der Revision, die zuletzt die Zeile geändert. Starten Sie optional das Kommentieren von der angegebenen Revision.

Oder Sie können ein grafisches Tool wie gitk verwenden, um zu sehen, was ein Commit ändert und alles.

+0

Git Schuld funktioniert für einen bestimmten Dateinamen und nicht eine bestimmte Version. Würden Sie mir bitte den genauen Befehl senden? Mit einer bestimmten Version möchte ich herausfinden, wer ursprünglich die gelöschte Codezeile für ein bestimmtes Commit zu einem Repository hinzugefügt hat. –

+0

Wenn die Zeile 'call someUniqueLine' von' 54e872ea' in 'filename' gelöscht wurde, dann kann die Zeile im Eltern-Commit mit ' git blame filename -L '/^call someUniqueLine /', + 1 54e872ea^beschuldigt werden ' – Steve

+0

Wenn Sie alle Commits (Verlauf aller Commits) für eine Datei sehen möchten und welche Änderungen daran vorgenommen werden, können Sie' gitk 'verwenden, wenn die Installation von gitk kein Problem für Sie darstellt. – RaviTezu

3

Wenn ich die Frage richtig verstehe, möchten Sie herausfinden, wer ursprünglich eine Zeile hinzugefügt hat, die gerade gelöscht wurde? Zum Beispiel, in this commit sehen wir die Zeile =head1 C<import> gelöscht. Wer hat diese Zeile ursprünglich geschrieben?

--- a/lib/perl5i.pm 
+++ b/lib/perl5i.pm 
@@ -1118,27 +1118,29 @@ Example: 
    from CPAN or another repository. Your library paths are: 
     Indented list of paths, 1 per line... 

-=head1 C<import> 

-This subroutine is called automatically, see L<perlfunc/import>. 
+=head1 Turning off features 
... 

Der gewünschte Befehl lautet git blame. Dies zeigt an, welcher Commit die letzte Zeile geändert hat. In unserem Beispiel würde git blame lib/perl5i.pm uns zeigen, wer zuletzt jede Zeile der Datei berührt hat.

b755dda5 (Michael G. Schwern  2009-04-22 21:29:08 -0700 1) package perl5i; 
b755dda5 (Michael G. Schwern  2009-04-22 21:29:08 -0700 2) 
8baa7538 (Michael G. Schwern  2010-01-29 21:34:14 -0800 3) ###################################### 
a6231688 (Michael G. Schwern  2010-03-14 13:55:50 -0700 4) # The real code is in perl5i::2  # 
8baa7538 (Michael G. Schwern  2010-01-29 21:34:14 -0800 5) # Please patch that     # 
8baa7538 (Michael G. Schwern  2010-01-29 21:34:14 -0800 6) ###################################### 
... 

Das ist das Commit, der Name des Autors, wenn das Commit passiert ist, und die Zeile.

Dies ist nicht unbedingt der ursprüngliche Autor der Linie. Selbst ein Commit, das eine einfache Whitespace-Änderung bewirkt, wird angezeigt. Um dies zu vermeiden, fügen Sie -w hinzu, um Leerzeichen zu ignorieren. git blame -w lib/perl5i.pm.

Aber das ist für das aktuelle Commit. Sie können nach einer Schuld für ein bestimmtes Commit fragen, unser Beispiel ist 4519fb29cef, das die Zeile löschte. Wenn wir git blame -w lib/perl5i.pm 4519fb29cef tun, ist die Zeile bereits gelöscht worden, so dass es nicht in der Schuld erscheinen wird. Tun Sie stattdessen eine git blame auf dem vorherigen Commit. git blame -w lib/perl5i.pm 4519fb29cef^.

... 
4afdb783 (Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯  2013-03-01 11:16:27 +0100 1121) =head1 C<import> 
4afdb783 (Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯  2013-03-01 11:16:27 +0100 1122) 
4afdb783 (Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯  2013-03-01 11:16:27 +0100 1123) This subroutine is called automatically, see L<perlfunc/import>. 
... 

Commit 4afdb783 von Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯 zuletzt diese Linie berührt. Da Änderungen manchmal trivial sein können, tun Sie eine git log -p 4afdb783, um zu überprüfen, dass es eine signifikante Änderung ist. Wenn nicht, mach das Gleiche noch einmal. Führen Sie git blame auf dem Commit vor diesem: git blame -w 4afdb783^. Fahren Sie fort, bis Sie zu einer signifikanten Veränderung kommen.

+0

Vielen Dank für Ihre umfassende Antwort auf meine Frage. Ich muss diesen Prozess automatisieren und für viele Git-Commits ausführen. Daher kann nur Schuldzuweisung das Problem nicht lösen, da es Informationen über die gelöschte Codezeile erfordert und die Datei so ändert, dass nur die gelöschte Codezeile in einem bestimmten Commit ausgewählt wird. Ich muss diese Informationen manuell füttern und ich kann diesen Prozess nicht mit einem Skript automatisieren. –

+0

@MohsenLaali Sicher kannst du. Wenn Sie wissen wollen, wer zuletzt die Zeile 45 in foo.txt geändert hat, bevor Sie 4afdb783 committen, führen Sie 'git blame -L45,45 foo.txt 4afdb783 ^' aus. Fügen Sie ein "-p" hinzu, um es in einem maschinenfreundlichen Format zu erhalten. – Schwern

+0

danke für den Kommentar. Ich muss noch die Zeilennummer und den Dateinamen eingeben. Wie kann ich die gelöschte Zeile und die betroffene Datei in einem bestimmten Commit in einem maschinenfreundlichen Format finden? Ich kann diesen Befehl mit git Schuld verbinden und die Frage beantworten. –

Verwandte Themen