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
我正在做一个项目,其中一个要求是需要调用 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