我表面上处理的问题似乎很简单,但在幕后,事情变得很快。我还处于稻草人阶段,所以没有任何功能代码可以分享。
期望的行为:
我们使用提交注释中包含的错误 ID 将提交的差异附加到我们的错误跟踪应用程序。附件使用从 Git 中的 post-recieve 挂钩调用的脚本发生,并在 Gerrit 中合并更改。
问题:
当一个新分支最初被推送时,第一次提交的 $oldrev 值为 00000000000000000。这发生在每个新分支上,在 Gerrit 中,它发生在你推送到 HEAD:refs/for/$branch 的每个分支上。这导致新分支的第一次提交没有附加差异,或者在 Gerrit 的情况下,每次代码审查中的每个第一次提交都没有附加差异。
我目前提出的解决方案既复杂又丑陋。我希望有人可能知道一种更优雅的方法来确定给定分支的原始 SHA:
Step1:确定当前分支的父分支。
我毫不掩饰地从这个 GitHub 要点中窃取了用于检索父分支的命令:https ://gist.github.com/joechrysler/6073741
我的 $ 分支 = git rev-parse --abbrev-ref HEAD
; 我的 $ 父母 = git show-branch -a 2>/dev/null | grep '\*' | grep -v "$branch" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'
;
这两个 shell 命令很好地拉入了父分支,如果分支是无父分支的,则不给我任何输出,这样就可以轻松地通过脚本检查父子关系。问题是,当分支是使用从不再存在的分支生成的标记创建的分支时,该过程分崩离析,该分支使用没有其他分支引用的 SHA。在 Git 术语中,这意味着新分支是无父的,所以逻辑上一切都很好,但在实践中,我仍然想区分从 SHA 中提取分支的更改。
Step2:(假设有父分支)
运行 Git cherry 以仅提取与我的分支关联的提交,不包括来自父级的提交:
我的 $parent = git cherry -v $parent $refs;
提交顺序与正常的 git log 输出相反,因此最旧的 SHA 位于列表顶部,允许我从数组中提取包含字母和数字的第一个值。使用简单的 git log 命令提取第一个提交的 SHA 并确定它的父级:
我的@oldrevs= git log -n 2 --pretty=format:%H $first_sha
;
最后步骤:使用 for 循环删除 @oldrev 数组中不包含字母或数字的所有条目并设置
$oldrev = $oldrevs[-1];
因为 git log 输出最后显示最旧的提交。在 99% 的情况下,这消除了用于差异附件的空 SHA 值,但要跳过很多圈。任何人都可以建议一种更简洁的方法,该方法还可以为从引用提交的标签生成的分支提取原始 SHA,而该标签不再引用 repo 中的任何分支?