Есть ли "git cherry" в libgit2
Я работаю над проектом, и одним из требований является необходимость позвонить git cherry
Команда, чтобы получить некоторые различия между ветвями и другими - (обратите внимание, это не git cherry-pick
).
Я планировал использовать ruby rugged
драгоценный камень для этого проекта, но я не могу найти ничего в документации, поддерживает ли он git cherry
API или нет.
Прочный рубиновый фантик libgit2
но я не смог найти ничего в его документации.
- git-cherry документы: https://git-scm.com/docs/git-cherry
- Прочный камень: https://github.com/libgit2/rugged
- LibGit2: https://github.com/libgit2/libgit2
1 ответ
libgit2 (и, как следствие, вещи, построенные на нем, например, Rugged), находятся на довольно низком уровне. Там, вероятно, никогда не будет git cherry
-подобная функциональность, но вы можете написать ее самостоятельно.
К сожалению, на данный момент libgit2 не предоставляет реализацию идентификатора патча, которая используется Git для определения идентичных патчей. Если это так, или если вы хотите написать свой собственный, вы можете выполнить ревизию самостоятельно по двум диапазонам, используя Rugged::Walker
сравнивая, какие идентификаторы патчей из второго диапазона также присутствовали в первом диапазоне. Это по сути то, что делает 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