【问题标题】:Triggering post-checkout hook after "git checkout -b" command在“git checkout -b”命令后触发结帐后挂钩
【发布时间】:2016-02-12 02:47:13
【问题描述】:

之前here 提出了同样的问题,但是这两个答案对我没有多大帮助。

我无法让我的post-checkout 钩子将git checkoutgit 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 钩子中的逻辑,而不是在签出时执行。

【问题讨论】:

    标签: git githooks


    【解决方案1】:

    在结帐后的挂钩中,您无法真正区分。1 在任何情况下,您可能都不想想要尝试区分。考虑:

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

    在这里为git checkout -b newbr 做任何你想做的事情可能是有意义的,如果是这样,检查-b 标志(如果你可以让它工作)可能会适得其反。 (当origin/feature 存在并且本地分支feature 不存在时,还要考虑git checkout feature,这会创建feature 作为跟踪origin/feature 的新分支,即使再次没有-b 标志。)

    让我们再看一遍,我会建议一种不同的方法:

    仅当创建新的本地分支时

    如果在你的钩子中,你保存了一个保存在一个文件中的“所有可见的本地分支”列表怎么办? (也许.git/ozgur/branchlist 是一个合理的地方来保存它。我们想要一些跟随存储库的东西,git 本身不太可能使用。)然后,如果结帐是分支式结帐($3 是@987654332 @),比较当前分支和列表:

    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 for-each-ref refs/heads 输出进行比较),也许还可以在额外的 git 挂钩中。但这可能足以满足您的目的。


    1实际上, 有一种方法可以判断,至少在可以让您查看进程树并查看其命令参数的系统上。从钩子中,找到您的父进程 git checkout 并查看它是否具有 -b 标志。但是它不适用于两步 git branch ...; git checkout 序列,也不适用于从上游分支自动创建的分支。

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 2020-12-19
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2016-11-07
      相关资源
      最近更新 更多