Grit::Commit
新しい2 つのオブジェクトを区別できるようにしたいと考えています。私がより新しいとは、commit_A
が の親 (または親の親など) であるcommit_B
場合、commit_B
より新しいということです。commit_A
これは、とcommit_B
が同じブランチにあることを前提としています。
をGrit::Commit#date()
使おうと思ったのですが、これは不正確だと思います。
何か案は?
これが私が最終的に実装したものです。説明についてはコメントを参照してください。
パフォーマンスは非常に遅いですが、repo.git.rev_list (method_missing 経由) を使用するとさらに悪化しました。
require 'grit'
module Grit
class Commit
# Returns true if any commits in +commits+ are decendants of calling commit. True
# means that one or more commits in +commits+ are newer.
def has_decendant_in? *commits
total_commits = commits.flatten
raise ArgumentError "at least one commit required." if total_commits.empty?
total_commits.each do |commit|
return true if repo.commits_between(commit.id, id).empty?
end
return false
end
# Returns an Array of commits which tie for being the newest commits. Ties can
# occur when commits are in different branches.
def self.newest *commits
oldest_commits = []
total_commits = commits.flatten
raise ArgumentError "at least one commit required." if total_commits.empty?
(total_commits).each do |commit|
if commit.has_decendant_in?(total_commits - [commit])
oldest_commits << commit
end
end
return total_commits - oldest_commits
end
end
end
以下が役に立ちます... git log --graph または gitk を使用できます