【问题标题】:Is there a 'git cherry' in libgit2libgit2 中是否有“git 樱桃”
【发布时间】:2018-03-25 20:13:08
【问题描述】:

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

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

Rugged 是 libgit2 的 ruby​​ 包装器,但我在它的文档中也找不到任何东西。

【问题讨论】:

  • 我知道你想要这个问题的答案,但这是题外话,因为你要的是图书馆或外部资源。

标签: ruby git rugged


【解决方案1】:

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

【讨论】:

  • 谢谢...这就是我要找的。不是代码,而是关于为什么 libgit2(以及通过扩展坚固)不提供开箱即用的 git cherry 命令的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多