我是新手Rugged用户,我正在尝试检测提交历史记录中的文件重命名。我正在将每个提交与其第一个父进行区分,如下所示:
repo = Rugged::Repository.discover("foo")
walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_TOPO)
walker.push("master")
walker.each.take(200).each do |commit|
puts commit.oid
puts commit.message
diffs = nil
# Handle Root commit
if commit.parents.count > 0 then
diffs = commit.parents[0].diff(commit)
else
diffs = commit.diff(nil)
end
(files,additions,deletions) = diffs.stat
puts "Files changed: #{files}, Additions: #{additions}, Deletions: #{deletions}"
paths = [];
diffs.each_delta do |delta|
old_file_path = delta.old_file[:path]
new_file_path = delta.new_file[:path]
puts delta.status
puts delta.renamed?
puts delta.similarity
paths += [delta]
end
puts "Paths:"
puts paths
puts "===================================="
end
walker.reset
但是,当我进行重命名时,程序将输出添加和删除(A和D状态)。这匹配git log --name-status
的输出。
另一方面,我发现使用git log --name-status --format='%H' --follow -- b.txt
正确地将重命名显示为R100
。
回购历史和git的输出可以在以下要点中看到:https://gist.github.com/ifigueroap/60716bbf4aa2f205b9c9
我的问题是如何使用Rugged的Diff或Delta对象来检测这样的文件重命名......
由于
答案 0 :(得分:2)
在访问diffs.stat
之前,您应使用diffs.find_similar!
致电:renames => true
。那将修改要做的diffs
对象包括重命名信息。默认情况下不会这样做,因为底层操作非常复杂,在大多数情况下不需要。
请查看find_similar!
此处的文档:https://github.com/libgit2/rugged/blob/e96d26174b2bf763e9dd5dd2370e79f5e29077c9/ext/rugged/rugged_diff.c#L310-L366以获取更多选项。