Git - 对于单个文件,每行更改的次数

时间:2017-03-02 08:44:18

标签: git bash

摘要

鉴于Git版本控制下的文件,我想使用Git内置函数或Bash生成报告,其中列出了每行更改的次数。

差异,散列,作者和其他细节将被丢弃,唯一需要的结果是每一行的数字,表示自历史开始以来的变化量。

该文件保证具有相同的结构和行数,否则报告几乎没用。

的原因

我正在训练神经网络,将中间状态保持在文件系统中。此导出描述了系统中每个神经元的连接和权重。

由于文件受版本控制,我想通过查看它们的易变性来衡量连接的强度。这种波动可能与连接发生变异的次数有关。一个连接是一行。

问题

我正在考虑git loggit blame或两者的精心组合以生成此类报告。

我的实际解决方案使用带有git log标记的L并逐行迭代。虽然这很有效,但生成包含数百次提交的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 - 生成报告的执行时间的最佳解决方案是什么?列出了给定文件中每行更改的次数?

1 个答案:

答案 0 :(得分:1)

鉴于该文件总是 k 行,并且您想知道行 L i 多少次,0≤i&lt; ; 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本身。