兩支閘改看「指令要動的那個 repo」,不看 hook 自己的環境/cwd(inkstone/ISEP#109 → comment 6629)
① line-needs-own-worktree.sh:出路 `WORKTREE_OK=1 git -C … checkout …` 改認指令字串裡的字面前綴
(舊版讀 hook 自己的環境變數,PreToolUse hook 跟指令不是同一個行程,那行永遠走不通)。
判準是位置不是字:前綴必須掛在會移動 HEAD 的那條 git 指令上。
lib/checkout_target_dir.py 加 `--escape NAME=1`;push_target_dir._classify 在 strip_env 時
把前綴留在 verb 事件裡(find_push_target 行為不變,主線閘 10+19 條照綠)。
② github-contact-guard.sh:remote 名在「這條指令實際會推的那個 repo」裡解(沿用 lib/push_target_dir.py
解 cd 鏈/-C/子殼),解不出來才退回 cwd。判準仍是 remote URL 主機,不是「有 -C 就放行」。
測試:A24 59→69(E 群把閘印的那一行原樣餵回去;舊閘 3 條紅)、
A39 14→26(payload 帶 cwd、cwd≠目標 repo;舊閘 7 條紅=4 誤攔+3 漏擋)。
盤點表:61 支/85 條,改判準不加閘,當場數的。
版本:待總管定版。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
This commit is contained in:
@@ -87,12 +87,29 @@ try: print(json.load(sys.stdin).get('cwd','') or '')
|
||||
except Exception: print('')
|
||||
" 2>/dev/null)
|
||||
[ -n "$CWD" ] || CWD=$(pwd)
|
||||
# 🔴 2026-09-07(inkstone/ISEP#109 → comment 6629):remote 名要在**這條指令實際會推的
|
||||
# 那個 repo** 裡解,不是在 hook 收到的 cwd 裡解。雲端薄殼的 cwd 是 GitHub 那份
|
||||
# (origin=github.com),總管站在那裡 `git -C <InkStoneCo> push origin x`
|
||||
# (InkStoneCo 的 origin=Gitea)——舊版拿 cwd 解 origin ⇒ 判成「指向 GitHub」擋下,
|
||||
# `-C` 看都沒看;反過來,站在 Gitea 那份 `git -C <薄殼> push origin x` 則**漏擋**。
|
||||
# ⇒ 沿用 lib/push_target_dir.py(推 main 那道閘 08-23 就是為同一個病接的它):
|
||||
# 純 tokenize 解出 cd 鏈/-C,解得出來就 cd 進去(唯讀)問 git;解不出來
|
||||
# (`cd $VAR`、目錄不存在)才退回 cwd——退回的方向是「照舊」,不是放寬。
|
||||
# 判準沒變:仍是 remote 解出來的 URL 主機(唯一識別碼),不是「有沒有 -C」。
|
||||
PUSHDIR="$CWD"
|
||||
_ptd="$(dirname "$0")/lib/push_target_dir.py"
|
||||
if [ -f "$_ptd" ]; then
|
||||
_expr=$(printf '%s' "$CMD" | python3 "$_ptd" 2>/dev/null || printf '')
|
||||
if [ -n "$_expr" ]; then
|
||||
PUSHDIR=$(cd "$CWD" 2>/dev/null && cd "$_expr" 2>/dev/null && pwd) || PUSHDIR="$CWD"
|
||||
fi
|
||||
fi
|
||||
# 取 push 後面第一個非 flag 的字當 remote 名;沒有就是 origin
|
||||
RNAME=$(printf '%s' "$CMD" | sed -nE 's/.*git[[:space:]]+([^|;&]*[[:space:]])?push[[:space:]]+(-[^[:space:]]+[[:space:]]+)*([A-Za-z0-9._//-]+).*/\3/p' | head -1)
|
||||
[ -n "$RNAME" ] || RNAME="origin"
|
||||
RURL=$(git -C "$CWD" remote get-url "$RNAME" 2>/dev/null)
|
||||
RURL=$(git -C "$PUSHDIR" remote get-url "$RNAME" 2>/dev/null)
|
||||
if printf '%s' "$RURL" | grep -qi 'github\.com'; then
|
||||
HIT="git push → github(remote「$RNAME」指向 GitHub)"
|
||||
HIT="git push → github($PUSHDIR 的 remote「$RNAME」指向 GitHub:$(printf '%s' "$RURL" | sed 's|//[^@]*@|//<憑證省略>@|g'))"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user