話結(jié)束時(shí)自動(dòng)提交并推送代碼)
Session Auto-Commit利用 GitHub Copilot Hooks 在會(huì)話結(jié)束時(shí)自動(dòng)提交并推送代碼【免費(fèi)下載鏈接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilotCopilot coding agent 在會(huì)話中會(huì)修改大量文件一旦會(huì)話結(jié)束未提交的改動(dòng)可能散落在工作區(qū)中存在丟失風(fēng)險(xiǎn)。本指南圍繞 awesome-copilot 倉庫中的 Session Auto-Commit Hook 展開講解如何基于 GitHub Copilot 的sessionEnd事件自動(dòng)完成「檢測(cè)改動(dòng) → 暫存 → 時(shí)間戳提交 → 推送遠(yuǎn)端」的完整流程并深入剖析其 Bash 腳本實(shí)現(xiàn)、hooks.json配置字段與可定制方向。讀完本文你將掌握一套零手工干預(yù)的會(huì)話備份機(jī)制并理解 Copilot Hooks 的安裝、配置與運(yùn)行契約。概述這個(gè) Hook 做什么Session Auto-Commit 是一個(gè)運(yùn)行在 Copilot coding agent 會(huì)話結(jié)束時(shí)的命令型 Hook其核心目標(biāo)是只要 agent 在會(huì)話期間產(chǎn)生了改動(dòng)就自動(dòng)提交并推送到遠(yuǎn)端確保工作永不丟失。根據(jù)倉庫中的 README該 Hook 會(huì)自動(dòng)執(zhí)行以下操作檢測(cè)是否存在未提交的改動(dòng)uncommitted changes暫存全部改動(dòng)stage all changes創(chuàng)建一個(gè)帶時(shí)間戳的提交timestamped commit推送到遠(yuǎn)端倉庫push to the remote repository它帶來的四個(gè)核心價(jià)值點(diǎn)自動(dòng)備份Automatic BackupCopilot 會(huì)話產(chǎn)出的工作不會(huì)因會(huì)話結(jié)束而丟失時(shí)間戳提交Timestamped Commits每個(gè)自動(dòng)提交都包含會(huì)話結(jié)束時(shí)間便于回溯「哪次會(huì)話改了什么」安全執(zhí)行Safe Execution只有存在實(shí)際改動(dòng)時(shí)才提交無改動(dòng)時(shí)靜默退出不產(chǎn)生空提交錯(cuò)誤處理Error Handling推送失敗時(shí)優(yōu)雅降級(jí)——改動(dòng)仍保留在本地提交中不會(huì)阻塞會(huì)話結(jié)束。該 Hook 位于 hooks/session-auto-commit/由三個(gè)文件組成README.md使用文檔、hooks.jsonHook 配置、auto-commit.shBash 實(shí)現(xiàn)腳本。前置知識(shí)Copilot Hooks 與事件模型在動(dòng)手安裝前先理解 Hook 的定位。根據(jù)倉庫的 Hooks 總覽文檔Hooks 是「由 Copilot coding agent 會(huì)話中的特定事件觸發(fā)的自動(dòng)化工作流」支持的事件包括sessionStart、sessionEnd、userPromptSubmitted、preToolUse、postToolUse、errorOccurred等。每個(gè) Hook 是一個(gè)文件夾包含README.md和hooks.json配置可能還附帶輔助腳本。Session Auto-Commit 掛在sessionEnd事件上屬于「會(huì)話收尾類」Hook。同類會(huì)話結(jié)束事件下的 Hook 還有Dependency License Checker會(huì)話結(jié)束時(shí)掃描新增依賴的許可證合規(guī)性check-licenses.shSecrets Scanner會(huì)話結(jié)束時(shí)掃描會(huì)話期間被修改的文件是否泄露密鑰scan-secrets.shSession Logger記錄會(huì)話活動(dòng)用于審計(jì)與分析。它們與 Session Auto-Commit 可以組合使用——例如會(huì)話結(jié)束時(shí)先掃描密鑰、再自動(dòng)提交形成完整的收尾流水線。安裝三步接入你的倉庫按照 Session Auto-Commit README 的安裝說明接入流程分為三步第一步拷貝 Hook 文件夾到目標(biāo)倉庫cp -r hooks/session-auto-commit .github/hooks/Copilot Hooks 的約定存放位置是倉庫內(nèi)的.github/hooks/目錄每個(gè) Hook 獨(dú)立一個(gè)子目錄參見 instructions/hooks.instructions.md 中的目錄結(jié)構(gòu)規(guī)范。第二步確保腳本可執(zhí)行chmod x .github/hooks/session-auto-commit/auto-commit.shauto-commit.sh 以#!/bin/bash開頭若缺少可執(zhí)行權(quán)限Hook 宿主將無法運(yùn)行它。第三步提交到默認(rèn)分支將 Hook 配置提交到倉庫的默認(rèn)分支。這一點(diǎn)很關(guān)鍵——根據(jù) instructions/hooks.instructions.md 的說明云 agentcloud agent只會(huì)從倉庫默認(rèn)分支加載 Hooks如果hooks.json只存在于功能分支上云 agent 將無法感知到它。配置hooks.json 逐字段解析該 Hook 的配置位于 hooks/session-auto-commit/hooks.json完整內(nèi)容如下{ version: 1, hooks: { sessionEnd: [ { type: command, bash: .github/hooks/session-auto-commit/auto-commit.sh, timeoutSec: 30 } ] } }對(duì)照 instructions/hooks.instructions.md 中的配置字段說明各字段含義如下字段必填作用version是配置格式版本當(dāng)前為1hooks是事件名到 Hook 條目數(shù)組的映射如sessionEndtype是Hook 類型command表示執(zhí)行本地腳本bash是bash/powershell 至少其一在 Unix / Bash 宿主上執(zhí)行的命令行powershell是bash/powershell 至少其一在 Windows / PowerShell 宿主上執(zhí)行的命令行本 Hook 未提供說明其設(shè)計(jì)面向 Bash 環(huán)境cwd否工作目錄相對(duì)于倉庫根目錄缺省時(shí)用宿主默認(rèn)值timeoutSec否宿主終止腳本前的最大等待秒數(shù)默認(rèn) 30本 Hook 顯式配置為 30env否以進(jìn)程環(huán)境變量形式傳入腳本的額外靜態(tài)配置值得注意的一點(diǎn)腳本路徑寫為.github/hooks/session-auto-commit/auto-commit.sh這與 README 中安裝到.github/hooks/的步驟一致。如果你的倉庫將 Hook 安裝在別的路徑需要同步修改bash字段。此外timeoutSec: 30意味著git push必須在 30 秒內(nèi)完成或被宿主終止——這對(duì)慢速網(wǎng)絡(luò)環(huán)境是潛在的調(diào)優(yōu)點(diǎn)可以按需增大。原理auto-commit.sh 源碼逐段剖析腳本實(shí)現(xiàn)位于 hooks/session-auto-commit/auto-commit.sh。它遵循「小而確定」的 Hook 設(shè)計(jì)原則全程不讀取 stdin 事件 JSONsessionEnd事件對(duì) stdout 沒有結(jié)構(gòu)化要求屬于收尾型 Hook只依賴 Git 自身狀態(tài)。我們逐段拆解。1. 嚴(yán)格模式與跳過開關(guān)#!/bin/bash set -euo pipefail # Check if SKIP_AUTO_COMMIT is set if [[ ${SKIP_AUTO_COMMIT:-} true ]]; then echo ?? Auto-commit skipped (SKIP_AUTO_COMMITtrue) exit 0 fiset -euo pipefail是 instructions/hooks.instructions.md 推薦的 Bash 嚴(yán)格模式遇到錯(cuò)誤立即退出、未定義變量報(bào)錯(cuò)、管道中任一環(huán)節(jié)失敗即失敗。腳本開頭檢查環(huán)境變量SKIP_AUTO_COMMIT為true時(shí)直接退出——這是 README 中「臨時(shí)禁用」方案的實(shí)現(xiàn)基礎(chǔ)。2. Git 倉庫與改動(dòng)檢測(cè)# Check if were in a git repository if ! git rev-parse --is-inside-work-tree /dev/null; then echo ?? Not in a git repository exit 0 fi # Check for uncommitted changes if [[ -z $(git status --porcelain) ]]; then echo ? No changes to commit exit 0 fi兩重防御性檢查用git rev-parse --is-inside-work-tree確認(rèn)當(dāng)前目錄處于 Git 工作樹內(nèi)否則直接退出避免在非倉庫目錄報(bào)錯(cuò)刷屏用git status --porcelain檢測(cè)未提交改動(dòng)輸出為空則說明工作區(qū)干凈直接以「No changes to commit」退出——這正是 README「只在確有改動(dòng)時(shí)才提交」特性的實(shí)現(xiàn)。--porcelain是面向腳本的機(jī)器可讀輸出格式比人類可讀的git status更適合做空值判斷。3. 暫存與時(shí)間戳提交echo Auto-committing changes from Copilot session... # Stage all changes git add -A # Create timestamped commit TIMESTAMP$(date %Y-%m-%d %H:%M:%S) git commit -m auto-commit: $TIMESTAMP --no-verify 2/dev/null || { echo ?? Commit failed exit 0 }git add -A暫存所有改動(dòng)包括新增、修改、刪除的文件提交信息格式為auto-commit: YYYY-MM-DD HH:MM:SS例如auto-commit: 2026-09-09 18:05:32--no-verify繞過倉庫自身的 pre-commit 鉤子避免用戶的 pre-commit 檢查如 lint、格式化阻塞自動(dòng)提交——這是 README「Notes」中明確說明的設(shè)計(jì)取舍提交失敗例如配置了 user.name/user.email 缺失導(dǎo)致的提交報(bào)錯(cuò)時(shí)捕獲錯(cuò)誤并輸出「Commit failed」后以 0 退出保證不會(huì)因提交失敗影響會(huì)話結(jié)束流程。4. 推送與降級(jí)處理# Attempt to push if git push 2/dev/null; then echo ? Changes committed and pushed successfully else echo ?? Push failed - changes committed locally fi exit 0推送成功輸出確認(rèn)信息推送失敗網(wǎng)絡(luò)問題、認(rèn)證失敗、遠(yuǎn)端沖突等則提示「Push failed - changes committed locally」——改動(dòng)已留在本地提交中隨時(shí)可以手動(dòng)git push補(bǔ)救。無論成敗腳本最終都返回exit 0呼應(yīng) README 中的承諾「失敗的推送不會(huì)阻塞會(huì)話終止」。5. 完整運(yùn)行時(shí)序結(jié)合 instructions/hooks.instructions.md 對(duì)sessionEnd事件的說明一次完整執(zhí)行鏈路如下Copilot coding agent 會(huì)話結(jié)束宿主觸發(fā)sessionEnd事件事件 payload 包含timestamp、cwd、reason等字段其中reason可取complete、error、abort、timeout、user_exit宿主執(zhí)行hooks.json中sessionEnd數(shù)組內(nèi)的命令型 Hook即bash .github/hooks/session-auto-commit/auto-commit.sh最長(zhǎng)等待 30 秒腳本依次完成跳過開關(guān)檢查 → Git 倉庫檢查 → 改動(dòng)檢測(cè) →git add -A→git commit --no-verify→git push腳本輸出人類可讀的進(jìn)度信息返回exit 0會(huì)話正常收尾。定制根據(jù)團(tuán)隊(duì)工作流改造README 明確指出可以從四個(gè)方面定制 auto-commit.sh。下面給出可直接落地的示例。定制提交信息格式時(shí)間戳格式與信息前綴都集中在提交語句中可以自由調(diào)整# 更精確到秒級(jí)毫秒或改為日期 會(huì)話編號(hào) TIMESTAMP$(date %Y%m%d-%H%M%S) git commit -m chore(copilot): auto-save $TIMESTAMP --no-verify也可以結(jié)合sessionEnd事件的 payload 信息讀取傳入 stdin 的 JSON 中的reason字段拼入提交信息payload$(cat) reason$(printf %s $payload | jq -r .reason // unknown) git commit -m auto-commit: $TIMESTAMP (session: $reason) --no-verify選擇性暫存不想把所有改動(dòng)一股腦提交時(shí)把git add -A換成精確的路徑模式git add src/ tests/ docs/ # 或排除特定目錄 git add -A :!node_modules :!dist注意修改暫存策略后README「Safe Execution」特性只在有改動(dòng)時(shí)提交依然生效因?yàn)槟_本先通過git status --porcelain判斷全局是否有改動(dòng)。僅推送到特定分支默認(rèn)的git push會(huì)推送到當(dāng)前分支的上游。如需限制推送范圍可加上分支判斷CURRENT_BRANCH$(git rev-parse --abbrev-ref HEAD) if [[ $CURRENT_BRANCH main || $CURRENT_BRANCH develop ]]; then git push origin $CURRENT_BRANCH 2/dev/null || echo ?? Push failed else echo ?? Skipping push on branch: $CURRENT_BRANCH fi增加通知在推送成功或失敗分支里接入通知渠道例如發(fā)送桌面通知或 Slack 消息if git push 2/dev/null; then echo ? Changes committed and pushed successfully command -v notify-send /dev/null notify-send Copilot Auto-commit pushed ? else echo ?? Push failed - changes committed locally command -v notify-send /dev/null notify-send -u critical Copilot Auto-commit push failed fi更推薦的做法是把通知開關(guān)做成env配置。參照 instructions/hooks.instructions.md 對(duì)env字段的說明在 hooks.json 中靜態(tài)注入開關(guān)腳本通過環(huán)境變量讀取從而讓同一份腳本在不同倉庫表現(xiàn)不同無需改代碼{ version: 1, hooks: { sessionEnd: [ { type: command, bash: .github/hooks/session-auto-commit/auto-commit.sh, cwd: ., timeoutSec: 30, env: { ENABLE_NOTIFICATIONS: true, SKIP_AUTO_COMMIT: false } } ] } }禁用兩種臨時(shí)關(guān)閉方式README 提供了兩種臨時(shí)禁用方案都不需要?jiǎng)h除文件方式一注釋或移除sessionEnd配置。編輯 hooks.json刪除hooks對(duì)象中的sessionEnd鍵或整個(gè)文件改名重啟會(huì)話后 Hook 即不再觸發(fā)。方式二設(shè)置環(huán)境變量。在運(yùn)行 Copilot 的 shell 中導(dǎo)出變量后腳本會(huì)在第一步直接跳過export SKIP_AUTO_COMMITtrue這一機(jī)制在 auto-commit.sh 的開頭有明確的實(shí)現(xiàn)對(duì)應(yīng)輸出?? Auto-commit skipped后exit 0適合臨時(shí)不想要自動(dòng)提交、但又不想動(dòng)配置文件的場(chǎng)景。注意事項(xiàng)與適用邊界綜合 README 的 Notes 與腳本實(shí)現(xiàn)使用前請(qǐng)確認(rèn)以下幾點(diǎn)--no-verify是有意為之自動(dòng)提交會(huì)繞過你倉庫的 pre-commit 鉤子。這意味著 pre-commit 中配置的格式校驗(yàn)、密鑰掃描等不會(huì)在自動(dòng)提交時(shí)執(zhí)行——如果你的團(tuán)隊(duì)把安全檢查放在 pre-commit 里建議與 Secrets Scanner 等會(huì)話級(jí)掃描 Hook 配合使用推送失敗不阻塞會(huì)話push 失敗時(shí)改動(dòng)留在本地提交中需要人工補(bǔ)推網(wǎng)絡(luò)不穩(wěn)或認(rèn)證過期時(shí)要注意這一點(diǎn)需要提前配置好 Git 憑據(jù)腳本本身不處理認(rèn)證遠(yuǎn)端推送依賴已配置的 credential helper、SSH key 或 PAT同時(shí)適配兩種客戶端README 聲明該 Hook 同時(shí)適用于 Copilot coding agent 與 GitHub Copilot CLI根據(jù) instructions/hooks.instructions.md 的說明同一份.github/hooks/*.json配置與腳本契約在 CLI、VS Code 和云 agent 之間是通用的但云 agent 只加載默認(rèn)分支上的 Hook提交用戶身份依賴 Git 配置自動(dòng)提交會(huì)使用倉庫全局/本地配置的user.name與user.email未配置時(shí)git commit將失敗腳本會(huì)以「Commit failed」優(yōu)雅退出遵循 Hook 通用設(shè)計(jì)規(guī)則Hook 運(yùn)行在會(huì)話收尾的關(guān)鍵路徑上應(yīng)保持同步、有界、非交互本 Hook 的 30 秒超時(shí)與純 Git 操作符合這一約束。小結(jié)Session Auto-Commit 是 Copilot Hooks「會(huì)話收尾自動(dòng)化」的典型范例一個(gè)不超過 45 行的 Bash 腳本加上 11 行的hooks.json配置就實(shí)現(xiàn)了「會(huì)話結(jié)束即備份」的可靠性保障。其腳本在 hooks/session-auto-commit/auto-commit.sh配置在 hooks/session-auto-commit/hooks.json安裝總覽可參考 docs/README.hooks.mdHook 編寫的完整規(guī)范見 instructions/hooks.instructions.md。在安全執(zhí)行、優(yōu)雅降級(jí)與時(shí)間戳追溯三個(gè)維度上它為「如何編寫一個(gè)合格的 Copilot Hook」提供了可直接復(fù)用的參考實(shí)現(xiàn)?!久赓M(fèi)下載鏈接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考