Получить последний коммит, где файл изменился
Моя задача - выяснить, каков идентификатор последнего коммита, где изменился конкретный файл. Я использую ruby / rugged. Единственное решение, которое я нашел, - это просмотреть все коммиты, найти файл в дереве, связанном с коммитом для этого файла, и сравнить 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
Это работает, но кажется довольно сложным. Должны быть более простые способы получения информации, "что изменилось с фиксацией". Есть ли более простой и понятный способ сделать то же самое?
1 ответ
Бег $ git log <file>
даст вам обратный хронологический журнал только коммитов, которые изменили данный файл. $ git whatchanged <file>
сделает то же самое, добавив строку с подробной информацией об изменении (например, изменение режима, тип изменения). Это отлично подходит для визуальных целей, но не так много для сценариев.
Если вам нужен только хэш самого последнего коммита, хорошо подойдет следующее: $ git rev-list --max-count 1 HEAD <file>