簡體   English   中英

在“git checkout -b”命令后觸發結帳后掛鈎

[英]Triggering post-checkout hook after "git checkout -b" command

之前在這里同樣的問題,但是兩個答案都沒有幫助我。

我無法讓我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掛鈎中的邏輯。

在結帳后掛鈎中,您無法真正分辨出區別。 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/ozgur/branchlist東西,git 本身不太可能使用。)然后,如果結帳是分支式結帳( $31 ),將當前分支與列表進行比較:

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上不起作用git branch ...; git checkout git branch ...; git checkout序列,也不在從上游分支自動創建的分支上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM