【问题标题】:How do I find the files changed in a commit using Rugged?如何使用 Rugged 查找提交中更改的文件?
【发布时间】:2015-02-17 17:28:37
【问题描述】:

我计划使用 Rugged 以编程方式访问 Git 存储库。

我需要找出特定提交中更改的文件。

根据文档,提交对象提供以下内容。

  • 留言
  • 时间
  • 作者
  • 父母

我尝试了“树”路线,但没有成功。

我在 SO 中看到了一个与 Grit 相关的类似问题。但是,我想使用 Rugged。

In ruby/grit, how do I get a list of files changed in a specific commit?

【问题讨论】:

  • 我在 ruby​​-git 和崎岖不平之间交替。使用 ruby​​-git 得到了一个很好的解决方案。让其他可能走这条路的人继续提问。

标签: ruby rugged


【解决方案1】:

您可以使用Rugged::Commit#diff 获取提交与其第一个父级或另一个Rugged::CommitRugged::Tree 之间的更改。

【讨论】:

  • 我走了那条路,因为我使用“g.diff(commit, commit.parents.first).stats[:files].keys”来使用 ruby​​-git 找到它。不过我并没有取得太大的成功。
  • Rugged::Commit#diff 返回一个 Rugged::Diff 对象。您可以使用Rugged::Diff#deltas 方法获取已更改对象的列表,该方法将返回Rugged::Diff::Delta 对象列表。每个 delta 对象代表一个更改的文件。见rubydoc.info/gems/rugged/Rugged/Diff/Delta
  • 我非常接近。早些时候,我正在遍历 Rugged::Diff 并尝试在补丁对象上运行 each_delta。不幸的是,我将变量命名为“diffs”,并在“diff”变量中寻找 delta 方法。谢谢!
【解决方案2】:

这是基于 Arthur 回答的 sn-p。

require 'rugged'

paths = [];

repo = Rugged::Repository.new('/Users/geordee/Code/HasMenu/data')

walker = Rugged::Walker.new(repo)

walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
walker.push(repo.head.target)
walker.each do |commit|
  # skip merges
  next if commit.parents.count != 1

  diffs = commit.parents[0].diff(commit)
  diffs.each_delta do |delta|
    paths += [delta.old_file[:path], delta.new_file[:path]]
  end

end

puts paths

这可能会跳过第一次提交。

【讨论】:

    【解决方案3】:

    一种基于 HEAD 获取特定提交中所有文件的更简单方法。

    require "rugged"
    
    repo = Rugged::Repository.new('.')
    commit = repo.head.target
    
    paths = commit.diff(commit.parents.first).deltas.map { |d| [d.old_file[:path], d.new_file[:path]] }.flatten.uniq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2013-10-17
      相关资源
      最近更新 更多