在Hook中,为推送的分支中的第一个提交拉出一个diff来对照它创建的SHA

时间:2018-01-05 15:33:46

标签: git gerrit githooks gerrit-trigger

我表面上看起来似乎是一个简单的问题,但是在幕后,事情变得很快。我仍处于稻草人阶段,因此没有任何功能代码可供分享。

期望的行为:
我们使用提交注释中包含的错误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中的任何分支吗?

0 个答案:

没有答案