实施 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
我正在使用 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