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

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

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

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

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

Я пробовал маршрут "дерево", но не смог.

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

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


person Geordee Naliyath    schedule 17.02.2015    source источник
comment
Я чередовал ruby-git и прочный. Получил хорошее решение, используя ruby-git. Оставьте вопрос открытым для других, кто может пойти по этому пути.   -  person Geordee Naliyath    schedule 17.02.2015


Ответы (3)


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

person Arthur Schreiber    schedule 18.02.2015
comment
Я пошел по этому пути, так как я использую g.diff(commit, commit.parents.first).stats[:files].keys, чтобы найти его с помощью ruby-git. Хотя особого успеха у меня не было. - person Geordee Naliyath; 18.02.2015
comment
Rugged::Commit#diff возвращает объект Rugged::Diff. вы можете получить список измененных объектов с помощью метода Rugged::Diff#deltas, который вернет список Rugged::Diff::Delta объектов. Каждый дельта-объект представляет измененный файл. См. rubydoc.info/gems/rugged/Rugged/Diff/Delta. - person Arthur Schreiber; 18.02.2015
comment
Я был совсем рядом. Раньше я перебирал Rugged::Diff и пытался запустить each_delta для объекта patch. К сожалению, я назвал свою переменную diffs и искал дельта-метод в переменной diff. Спасибо! - person Geordee Naliyath; 18.02.2015

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

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

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

person Geordee Naliyath    schedule 18.02.2015

Более простой способ получить все файлы в конкретной фиксации на основе 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
person Антон Фоменко    schedule 15.05.2017