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 に答える