2015-09-16 4 views
6

Desidero ottenere alcune metriche su quali file nel mio repository sono attivi più di recente, utilizzando una misurazione che non richiede alcun calcolo dopo l'archiviazione. Quindi il numero di commit fa che è stato modificato l'ultima volta.Ottenere l'età di un file nei termini di commit in git

Quindi l'idea che ho è quindi:

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 

Quello che serve è un comando git non porcellana per ottenere l'elenco dei file in un commit data la sua sha.

+0

Non è l'intero albero di file a cui fa riferimento ogni commit Git? Avrai bisogno di diff commit adiacenti per determinare se un file è cambiato, –

+0

Questo è vero, tuttavia c'è, per esempio 'git show --stat ' che è in grado di elencare le modifiche dei file in un commit, ma non è stabile, e include anche informazioni extra che preferirei non analizzare out – EdJoJob

+1

'git show' fa semplicemente un diff del commit rispetto al suo genitore (s) (combinato diff se unione con più genitori). Devi fare la stessa cosa (forse facendo git farlo per te, ad esempio 'git diff-tree --name-status') per rilevare le modifiche. – torek

risposta

0

git show --stat <commitish> che è in grado di elencare i file cambiamenti in un commit, ma non è stabile,

Può essere stabile, con l'opzione --porcelain:

Utilizzare uno speciale formato linea destinato al consumo di script.
Le corse aggiunte/rimosse/invariate vengono stampate nel solito formato diff unificato, iniziando con un carattere +/-/ all'inizio della riga e estendendosi fino alla fine della riga.
Le nuove righe nell'input sono rappresentate da una tilde ~ su una riga a parte.

Avresti comunque bisogno di fare un po 'di analisi.

0

La soluzione finale era utilizzare git diff-tree -z --name-only --no-commit-id -r <sha>.

Origine: il richiedente domanda EdJoJob had edited the question per includere questo.

Problemi correlati