2017-03-02 35 views
2

摘要

考慮的Git版本控制下的文件,我想用git內置插件或擊的報告,其中列出了多少次,每次行已經改變。混帳 - 單個文件,次數每行改變

差異,哈希值,作者和其他細節將被丟棄,唯一需要的結果是每行的數字,代表自歷史開始以來的變化量。

該文件保證具有相同的結構和行數,否則該報告將不起作用。

原因

我訓練神經網絡,堅持中間狀態的文件系統。該導出描述系統中每個神經元的連接和權重。

由於文件處於版本控制之下,我想通過查看它們的不穩定性來衡量連接的強度。這種波動可能與連接發生變異的次數有關。一個連接是一條線。

問題

我正在考慮git loggit blame或兩者的良好的製造組合產生這樣的報告。

我的實際解決方案使用git logL標誌並逐行迭代。雖然這有效,但生成具有數百次提交的1000+ LOC文件的報告非常緩慢。

請參閱下面的代碼段以瞭解我所在的位置。

#!/bin/bash 

for ((line=$line_start; line<$line_end; line++)) ; do 
    lines=$(git log -L ${line},${line}:${file_input} | grep -c "diff") 
    echo "${line}:${lines}" >> ${file_output} 
done 

問題

依託VCS - 在這種情況下,Git的 - 什麼是關於執行時間生成一份報告,列出每一行中給定的文件已經被改變的時間量的最佳解決方案?

+0

這很有趣,但非常不平凡的任務。我想到的唯一可行的解​​決方案是以向後的順序分析差異,這可能是具有挑戰性的,因爲不知道在更改情況下刪除或添加了哪行。 –

+0

https://github.com/ptlis/diff-parser –

+0

這個怎麼樣:'git diff --shortstat' – CodeWizard

回答

1

鑑於該文件始終是ķ線長,你要知道有多少次排隊大號,0≤我< K,已經改變了,我想從A到B」的變化,回到A,回到B「計爲3次 - 自然解決方案似乎是:

read file first or last commit 
C = [0 for i in num_lines(file)] 
L = [file_line[i] for i in num_lines(file)] 
for commit in all_remaining_commits_in_forward_or_reverse_order: 
    read file from commit 
    for i in num_lines(file): 
     if file_line[i] != L[i]: 
      C[i] += 1 
      L[i] = file_line[i] 

(在僞代碼中)。除了從每個提交中提取文件(可能使用git show <rev>:<path>)以及獲取提交列表(可能是git log --topo-order <branch>)之外,幾乎沒有人要求使用Git本身。

+0

假設文件總是_k_行,並且你的假設也是正確的,這是安全的,A →B,B→A,A→B計爲3. – Aron

+0

我只有時間檢查你的git命令,並提出以下建議:'git log --format = format:%H --topo-order _file_ | xargs -I {} git show {}:_ file_'。這會在不到一秒的時間內生成25MB的輸出(文件的所有階段),所以執行時間實際上非常出色。 – Aron

+0

我想你的意思是'--pretty =格式:%H'或'--format =%H'。注意你可以使用'git rev-list'和'git log'具有基本相同的含義和參數,儘管你必須提供一個起點('git log'默認爲'HEAD'),如果你總是希望完整的hash ID('git rev-list'針對shell腳本,而'git log'針對用戶可消化的輸出)。 – torek