在" git checkout -b"之后触发结账后挂钩命令

时间:2015-11-11 02:29:11

标签: git githooks

之前问过同样的问题here然而这两个答案对我没什么帮助。

我无法将post-checkout挂钩与git checkout命令区别git checkout -b $1(前一个HEAD的sha1)和$2(两个呼叫的新HEAD的sha1相同。

这是我的结账后脚本:

#!/bin/bash

echo "old HEAD: $1"
echo "new HEAD: $2"
echo "checkout type: $3"

我执行了以下命令:

> ozgur@ozgurv:~/project (master)$ git checkout -b new_branch
old HEAD: e86423aa9f45053cb45b8ec15d463bb9684526a2
new HEAD: e86423aa9f45053cb45b8ec15d463bb9684526a2
checkout type: 1

> ozgur@ozgurv:~/project (new_branch)$ git checkout my_branch
old HEAD: e86423aa9f45053cb45b8ec15d463bb9684526a2
new HEAD: e86423aa9f45053cb45b8ec15d463bb9684526a2
checkout type: 1

我想要实现的是仅在创建新的本地分支时执行post-checkout挂钩中的逻辑,而不是在签出时。

1 个答案:

答案 0 :(得分:1)

你无法真正区分,在结账后挂钩。 1 在任何情况下,你都可能想要试图分辨出来。考虑:

$ git branch newbr     # make a new branch
$ git checkout newbr   # and now check it out

在这里执行git checkout -b newbr所做的任何事情都是有道理的,如果是这样的话,检查-b标志(如果可以让它工作)可能会适得其反。 (当git checkout feature存在且本地分支origin/feature不存在时,请考虑feature,这会创建feature作为追踪origin/feature的新分支,即使再次出现没有-b标志。)

让我们再看一遍,我会提出一个不同的方法:

  

仅在创建新的本地分支时

如果,在你的钩子里,你保存了一份保存在文件中的“所有见过的本地分支”的列表? (也许.git/ozgur/branchlist是一个合理的地方来保持这个。我们想要一些跟在存储库周围的东西,git本身不太可能使用。)然后,如果结账是分支式结账({{1} }是$3),将当前分支与列表进行比较:

1

这仍有一点缺陷:如果删除分支,它可能会保留在分支列表文件中。我们可以通过相当频繁地过滤掉已删除的分支来解决这个问题(将git_dir=$(git rev-parse --git-dir) || exit 1 branchlist=$git_dir/ozgur/branchlist if [ "$3" = 1 ]; then # Checked out a branch - what branch are we on now? # (Skip rest of code if we're on a detached HEAD.) curbranch=$(git symbolic-ref --short HEAD) || return # Is $curbranch in our branch list? Create empty # branch list first if needed. Can just "touch" but # this avoids changing the mod-time unnecessarily. [ -f $branchlist ] || : > $branchlist if ! grep "^$curbranch$" $branchlist > /dev/null; then echo "switching to as-yet-unvisited-branch $curbranch" echo $curbranch >> $branchlist # now we've visited it fi fi 内容与适当的$branchlist输出进行比较),也可以在其他git钩子中进行。但它可能足以满足您的目的。

1 实际上, 是一种告诉的方法,至少在让您查看进程树的系统上,并查看它们的命令参数。从钩子中,找到您的父git for-each-ref refs/heads进程,看看它是否有git checkout标志。但是它不能用于两步-b序列,也不能用于从上游分支自动创建的分支。