实现git branch-包含坚固的库

时间:2019-07-16 13:08:36

标签: ruby git branch rugged

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

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

此方法在命令输出方面存在一些缺陷(在不同的git版本中可能会发生变化),并且受主机上git二进制版本的影响,因此我试图查看是否可以使用{{3}替换该命令},但找不到类似的东西。

也许很坚固,无法实现--contains标志,但是我认为实现这种行为应该很容易:

给出任何git commit-ish (标签,commit sha等)如何获取(粗略地)包含该commit-ish的分支机构列表(本地和远程) ?

我需要实现类似github commit show page之类的东西,即tag xyz is contained in master, develop, branch_xx

1 个答案:

答案 0 :(得分:1)

最后用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