Получить последний коммит, где файл изменился

Моя задача - выяснить, каков идентификатор последнего коммита, где изменился конкретный файл. Я использую 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>

Другие вопросы по тегам