Как найти файлы, измененные в коммите, используя 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