如何解析git diff的输出并获取行信息(即已添加/修改了哪些行)?
我想要类似的东西
raw = `git diff`
parsed = Git.Diff.parse(raw)
parsed.each do |file|
file.each do |line|
puts "#{file.name} - #{line.number} - #{line.type}"
end
end
[
{
"file": "path/to/file1",
"lines": [
{ number: "1", type: "modified"},
{ number: "4", type: "deleted"},
{ number: "9", type: "added"}
]
},
{
"file": "path/to/file2",
"lines": [
{ number: "4", type: "modified"},
{ number: "5", type: "added"}
]
}
]
答案 0 :(得分:1)
您需要的是将输出正确分组为文件块,并保留所需的内容。
您只需运行
即可获得它task bootRunDev {
bootRun.configure {
systemProperty "spring.profiles.active", 'Dev'
}
}
bootRunDev.finalizedBy bootRun
`git --diff`
开头的行,您可以在其中获取文件名'diff --git'
开头的行是已添加的'+ '
开头的对于这些事情,Enumerable#slice_before浮现在脑海。
我最终得到了这个原型:
'- '
raw_data = `git diff`.split("\n")
# Keep what is needed
clean_data = raw_data.select { |li|
li.starts_with?('diff --git') ||
li.starts_with?('- ') ||
li.starts_with?('+ ')
}
# Group the by file
# [[file_1, line1, line2, line3], [file_2, line1]]
file_data = clean_data.slice_before { |li| li.starts_with?('diff --git') }
# This is the output format
output = Hash.new {|h,k| h[k] = { added: 0, removed: 0 } }
# Populate the output
file_data.each_with_object(output) do |f_data, memo|
file, *file_info = f_data
file = file.split(' b/').first.gsub('diff --git a/', '')
file_info.each { |f_info|
memo[file][f_info[0] == '+' ? :added : :removed] += 1
}
end
我相信它会变得更好:-)
答案 1 :(得分:1)
这就是我最后得到的
function more {
param([string[]]$paths)
$OutputEncoding = [System.Console]::OutputEncoding
if($paths) {
foreach ($file in $paths) {
Get-Content $file | more.com
}
}
else {
$input | more.com
}
}
答案 2 :(得分:0)
您可以试试 https://github.com/bguban/git_modified_lines gem。它只返回修改过的行,但可能会有用