2015-09-16 4 views
6

Ich möchte einige Metriken zu den Dateien in meinem Repository sind die zuletzt aktiv, mit einer Messung, die keine Berechnung nach dem Speicher benötigt. Also Anzahl der Commits vor der letzten Änderung.Holen Sie sich das Alter einer Datei in Bezug auf die Commits in git

So ist die Idee, die ich habe, ist also:

file_list = subprocess.Popen(['git', 'ls-files']) 
(files, _) = proc.communicate() 

missing_ages = files 
ages = {f: -1 for f in old_ages} 

commits_proc = subprocess.Popen(['git', 'ref-list', '--all', '--pretty=format:""']) 
(commits, _) = commits_proc.communicate() 
age = 0 

for commit_sha in [s.split(' ')[1] for s in commits] 
    commit_list = subprocess.Popen('some', 'git', 'command') 
    commit_files = commit_list.communicate() 

    for file in commit_files 
     if file in missing_ages 
      ages[file] = age 
      missing_ages.remove(file) 
    age += 1 

Was ich brauche, ein nicht-Porzellan git Befehl ist die Liste der Dateien in einer begehen aufgrund seiner sha zu bekommen.

+0

Wird nicht die gesamte Dateistruktur von jedem Git-Commit referenziert? Sie müssen benachbarte Commits unterscheiden, um festzustellen, ob eine Datei geändert wurde, –

+0

Das ist richtig, jedoch gibt es zum Beispiel 'git show --stat ', das in der Lage ist, die Dateiänderungen in einem Commit aufzulisten, aber es ist nicht stabil, und enthält auch zusätzliche Informationen, die ich lieber nicht aussortieren würde – EdJoJob

+1

'git show' macht einfach ein diff des Commits gegen seine Eltern (kombiniertes diff, wenn es mit mehreren Eltern zusammengeführt wird). Sie müssen dasselbe tun (vielleicht haben Sie es für Sie getan, z. B. 'git diff-tree --name-status'), um Änderungen zu erkennen. – torek

Antwort

0

git show --stat <commitish> die die Dateien Änderungen in einem Commit zur Liste der Lage ist, aber es ist nicht stabil,

Es kann stabil sein, mit der --porcelain Option:

Verwenden Sie eine spezielle Zeilenbasiertes Format bestimmt für Skriptverbrauch.
Hinzugefügte/entfernte/unveränderte Läufe werden im üblichen vereinheitlichten Diff-Format gedruckt, beginnend mit einem +/-/ Zeichen am Anfang der Zeile und bis zum Ende der Zeile.
Newlines in der Eingabe werden durch eine Tilde ~ auf einer eigenen Zeile dargestellt.

Sie müssten jedoch noch einige Parsing tun.

0

Die endgültige Lösung war git diff-tree -z --name-only --no-commit-id -r <sha> zu verwenden.

Quelle: der Frage Fragesteller EdJoJob had edited the question, um dies zu enthalten.

Verwandte Themen