如何在Fastlane合并分支至main后获取被合并分支的名称?
解决Fastlane合并PR后获取原分支名的问题
当PR合并到main分支后,当前分支已是main,git_branch自然拿不到原分支名,你可以通过以下几种方式解决:
方法1:解析合并提交信息
PR合并后会生成一条包含源分支信息的合并提交(比如Merge pull request #XXX from ABC-123),直接解析这条提交的内容提取分支名:
lane :jiraNotify do # 获取最近一次合并提交的完整信息 merge_commit_msg = sh("git log --merges -1 --pretty=format:%B", log: false).strip # 匹配"from 分支名"的格式,提取分支 if merge_commit_msg.match?(/from (\S+)/) source_branch = $1 if source_branch.include?("ABC") # 执行你的发布逻辑 puts "待处理工单分支:#{source_branch}" end else puts "未找到有效合并提交" end end
方法2:利用CI平台的环境变量
如果你的Fastlane工作流在CI(如GitHub Actions、GitLab CI)中运行,大部分CI平台会直接提供PR源分支的环境变量,无需解析git日志:
lane :jiraNotify do # 适配不同CI平台的环境变量 source_branch = ENV["GITHUB_HEAD_REF"] || ENV["CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"] || "" if !source_branch.empty? && source_branch.include?("ABC") # 执行你的发布逻辑 puts "待处理工单分支:#{source_branch}" else # 环境变量不存在时,回退到解析合并提交的方法 merge_commit_msg = sh("git log --merges -1 --pretty=format:%B", log: false).strip if merge_commit_msg.match?(/from (\S+)/) source_branch = $1 if source_branch.include?("ABC") puts "待处理工单分支:#{source_branch}" end else puts "无法获取源分支信息" end end end
方法3:通过Git父提交查找源分支
合并提交有两个父节点,第二个父节点对应源分支的最后一次提交,通过Git命令可以反向查到分支名:
lane :jiraNotify do # 获取最近合并提交的第二个父提交哈希 parent_hashes = sh("git log --merges -1 --pretty=format:%P", log: false).split return if parent_hashes.size < 2 # 根据父提交哈希查找对应的分支名 source_branch = sh("git name-rev --name-only #{parent_hashes[1]}", log: false).strip # 去除可能的~后缀(如ABC-123~1) source_branch = source_branch.split("~").first if source_branch.include?("ABC") # 执行你的发布逻辑 puts "待处理工单分支:#{source_branch}" else puts "无法识别工单分支格式" end end
内容的提问来源于stack exchange,提问作者Adrian Coman
相关产品推荐
相关产品推荐

