【问题标题】:How to detect a file rename using Rugged?如何使用 Rugged 检测文件重命名?
【发布时间】:2015-04-07 18:21:14
【问题描述】:

我是 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 对象来检测此类文件重命名...

谢谢

【问题讨论】:

    标签: rugged


    【解决方案1】:

    在访问diffs.stat 之前,您应该使用:renames => true 调用diffs.find_similar!。这将修改diffs 对象以包含重命名信息。默认情况下不这样做,因为底层操作非常复杂,在大多数情况下不需要。

    在此处查看find_similar! 的文档:https://github.com/libgit2/rugged/blob/e96d26174b2bf763e9dd5dd2370e79f5e29077c9/ext/rugged/rugged_diff.c#L310-L366 以获取更多选项。

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多