之前问过同样的问题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
挂钩中的逻辑,而不是在签出时。
答案 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
序列,也不能用于从上游分支自动创建的分支。