Как найти файлы, измененные в коммите, используя Rugged?

Я планирую использовать Rugged для программного доступа к репозиториям Git.

Мне нужно выяснить, какие файлы были изменены в конкретном коммите.

Фиксация объекта обеспечивает следующее, согласно документации.

  • сообщение
  • время
  • автор
  • дерево
  • родители

Я попробовал "древовидный" маршрут, но не смог добиться успеха.

Я вижу аналогичный вопрос, заданный в SO, в отношении Grit. Но я бы хотел использовать Rugged.

В ruby ​​/grit, как получить список файлов, измененных в конкретном коммите?

3 ответа

Решение

Ты можешь использовать Rugged::Commit#diff чтобы получить изменения между коммитом и его первым родителем или другим Rugged::Commit или же Rugged::Tree,

Вот фрагмент, основанный на ответе Артура.

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

Это, вероятно, пропускает первый коммит.

Более простой способ получить все файлы в конкретном коммите на основе 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
Другие вопросы по тегам