libgit2中是否有'git cherry'

Is there a 'git cherry' in libgit2

我正在做一个项目,其中一个要求是需要调用 git cherry 命令来获得分支和其他分支之间的一些差异 -(注意这不是 git cherry-pick) .

我打算在这个项目中使用 ruby rugged gem,但我在文档中找不到任何内容,无论它是否支持 git cherry API。

Rugged 是 ruby 对 libgit2 的封装,但我在其文档中也找不到任何内容。

libgit2(并且通过扩展,构建在它之上的东西,比如 Rugged)是相当低级的。可能永远不会内置类似 git cherry 的功能,但您通常可以自己编写一个。

遗憾的是,目前 libgit2 不提供补丁 ID 实现,这是 Git 用来确定相同补丁的技术。如果是这样,或者如果您想编写自己的代码,则可以使用 Rugged::Walker 在两个范围内自行执行修订,比较第二个范围中的哪些补丁程序 ID 也存在于第一个范围中。这基本上就是 Git 在幕后所做的事情。

以下是您可以执行的操作的示例,将 patch_id 函数替换为真实函数:

require 'rugged'
require 'digest'

def patch_id(patch)
  # This is not a real implementation; replace it with a real one.
  Digest::SHA1.hexdigest(patch.each_line.reject { |l| l =~ /^(diff|index|---|\+\+\+|@@)/ }.join)
end

def walk_revisions(repo, from, to)
  revisions = {}
  walker = Rugged::Walker.new(repo)
  walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
  walker.push(to)
  walker.hide(from)
  walker.each do |c|
    diff = c.parents[0].diff(c)
    revisions[patch_id(diff.patch)] = c.oid
  end
  revisions
end

repo = Rugged::Repository.new(ARGV[0])
a, b, c = ARGV[1..3].map { |r| repo.rev_parse(r) }
first = walk_revisions(repo, b, a)
second = walk_revisions(repo, c, b)
second.each do |id, rev|
  char = first.include?(id) ? '-' : '+'
  puts "#{char} #{rev}"
end