实施 git 分支 --contains with rugged library

Implement git branch --contains with rugged library

我正在使用 ruby 脚本在给定的 git 存储库上执行以下 git 命令。

  branches = `git branch -a --contains #{tag_name}`

这种方法在命令输出方面有一些缺点(可能会在不同的 git 版本中发生变化)并且受主机上 git 二进制版本的影响,所以我试图看看它是否是可以使用 rugged 替换该命令,但我找不到类似的东西。

也许在 rugged 中没有办法实现 --contains 标志,但我认为实现这种行为应该很容易:

给定任何 git commit-ish(标签、提交 sha 等)如何获取(具有坚固性)分支列表(都是本地的和远程)包含提交的?

我需要实现类似 github 提交显示页面的东西,即 tag xyz is contained in master, develop, branch_xx

终于用this code解决了:

def branches_for_tag(tag_name, repo_path = Dir.pwd)
  @branches ||= begin
    repo = Rugged::Repository.new(repo_path)
    # Convert tag to sha1 if matching tag found
    full_sha = repo.tags[tag_name] ? repo.tags[tag_name].target_id : tag_name
    logger.debug "Inspecting repo at #{repo.path}, branches are #{repo.branches.map(&:name)}"
    # descendant_of? does not return true for it self, i.e. repo.descendant_of?(x, x) will return false for every commit
    # @see https://github.com/libgit2/libgit2/pull/4362
    repo.branches.select { |branch| repo.descendant_of?(branch.target_id, full_sha) || full_sha == branch.target_id }
  end
end