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