получить последнюю фиксацию, в которой файл изменился

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

Это работает, но кажется сложным. Должны быть более простые способы получения информации, "что изменилось с фиксацией". Есть ли более простой и прямой способ сделать то же самое?


person Torsten Robitzki    schedule 23.08.2012    source источник


Ответы (1)


Запуск $ git log <file> даст вам обратный хронологический журнал только коммитов, которые изменили данный файл. $ git whatchanged <file> сделает то же самое, добавив строку с деталями изменения (например, изменение режима, тип изменения). Это отлично подходит для визуальных целей, но не для сценариев.

Если вам нужен только хеш самого последнего коммита, хорошо подойдет следующее: $ git rev-list --max-count 1 HEAD <file>

person David Cain    schedule 23.08.2012
comment
Спасибо за ответ. Работает нормально и намного быстрее, чем мое решение. Может быть, мне следует избавиться от прочного драгоценного камня и вызвать оболочку из моих задач по грабли. Я оставлю вопрос открытым, может быть, у кого-то есть решение с использованием Rugged. - person Torsten Robitzki; 23.08.2012