2

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

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

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

也许在崎岖不平的环境中没有办法实现--contains标志,但我认为实现这种行为应该很容易:

给定任何 git commit-ish(标签、提交 sha 等)如何获取(使用崎岖不平的)包含该 commit-ish 的分支列表(本地和远程)?

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

4

1 回答 1

1

最后用这段代码解决了:

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
于 2019-09-02T16:43:22.053 回答