3

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

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

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

  • 信息
  • 时间
  • 作者
  • 父母

我尝试了“树”路线,但未能成功。

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

在 ruby​​/grit 中,如何获取在特定提交中更改的文件列表?

4

3 回答 3

2

您可以使用Rugged::Commit#diff来获取提交与其第一个父级或另一个Rugged::CommitRugged::Tree.

于 2015-02-18T10:24:00.543 回答
1

这是基于亚瑟回答的片段。

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

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

于 2015-02-18T18:15:45.287 回答
0

一种更简单的方法来获取基于 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
于 2017-05-15T09:42:16.373 回答