Моя задача — выяснить, каков идентификатор последнего коммита, в котором изменился конкретный файл. Я использую рубин / прочный. Единственное решение, которое я придумал, — пройтись по всем фиксациям, найти файл в дереве, связанный с фиксацией для этого файла, и сравнить oid этих файлов с oid файла из первой (последней) фиксации:
def commit_oid commit, file
commit.tree.walk( :postorder ) { | root, obj |
return obj[ :oid ] if "#{root}#{obj[ :name ]}" == file
}
raise "\'#{file}\' not found in repository"
end
def find_last_commit file
johnny = Rugged::Walker.new( get_repository )
johnny.push get_repository.head.target
oid = commit_oid johnny.first, file
old_commit = johnny.first.oid
johnny.each do | commit |
new_oid = commit_oid commit, file
return old_commit if new_oid != oid
old_commit = commit.oid
end
old_commit
end
Это работает, но кажется сложным. Должны быть более простые способы получения информации, "что изменилось с фиксацией". Есть ли более простой и прямой способ сделать то же самое?