4

我手头的任务是弄清楚最后一次提交的提交 ID 是什么,特定文件在哪里更改。我正在使用红宝石/坚固耐用。我想出的唯一解决方案是遍历所有提交,在树中搜索与该文件的提交相关联的文件,并将该文件 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

这可行,但似乎很复杂。必须有一种更简单的方法来获取信息,“提交改变了什么”。有没有更简单、更直接的方法来完成同样的事情?

4

1 回答 1

6

运行$ git log <file>将为您提供仅更改给定文件的提交的反向时间顺序日志。$ git whatchanged <file>将做同样的事情,添加一行更改的详细信息(即模式更改,更改类型)。它非常适合视觉目的,但不适合脚本。

如果您只需要最近提交的哈希,则以下内容将很好地工作:$ git rev-list --max-count 1 HEAD <file>

于 2012-08-23T08:47:19.063 回答