鉴于Git版本控制下的文件,我想使用Git内置函数或Bash生成报告,其中列出了每行更改的次数。
差异,散列,作者和其他细节将被丢弃,唯一需要的结果是每一行的数字,表示自历史开始以来的变化量。
该文件保证具有相同的结构和行数,否则报告几乎没用。
我正在训练神经网络,将中间状态保持在文件系统中。此导出描述了系统中每个神经元的连接和权重。
由于文件受版本控制,我想通过查看它们的易变性来衡量连接的强度。这种波动可能与连接发生变异的次数有关。一个连接是一行。
我正在考虑git log
,git 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 - 生成报告的执行时间的最佳解决方案是什么?列出了给定文件中每行更改的次数?
答案 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本身。