🧭 一、背景與痛點

在日常開發中,開發者經常會遇到以下麻煩:

  • 😫 Push 被 GitHub 拒絕(GH013 Push Protection)
  • 🧨 Token 或敏感信息誤提交,導致倉庫被暫時封禁
  • 🕳️ Git 對象損壞(invalid object / error building trees)
  • 🌐 需要代理才能訪問 GitHub
  • 🧩 反覆清理 .git_bad_*、重建倉庫、恢復 HEAD
  • 🤯 需要安全推送,但不想把 Token 寫進 remote URL

傳統解決方式既繁瑣又危險,容易遺留憑據或破壞歷史。

因此,這個腳本的設計目標是——

“讓推送 GitHub 倉庫像按下一個按鈕一樣安全、智能、不可逆。”

⚙️ 二、腳本總體設計

該腳本是一個 全自動 Git 運維工具,核心目標是:

模塊

功能概述

🧱 倉庫檢測

自動檢測/創建遠程倉庫(支持個人或組織)

🧰 自愈機制

自動修復損壞的 .git 索引/對象

🔒 安全防護

檢測敏感信息(ghp_ / AWS / Google / OAuth)

🚫 GH013 防護

自動清洗違規文件 + 強制安全重推

🌐 網絡代理

自動配置/恢復代理,適配公司/校園網絡

🔑 安全推送

使用 Basic extraheader 方式,不泄露 Token

🧹 歷史清理

清除 .git_bad_*、禁用 pre-push hook

🧼 環境恢復

執行完畢後自動還原所有代理與憑據配置

🧩 三、關鍵功能模塊詳解

1️⃣ 安全代理自動管理

腳本會在執行前自動設置全局代理(可自定義):

HTTP_PROXY_URL = "http://127.0.0.1:7890"

在執行完畢後恢復原始代理設置,保證你的系統配置不會被污染:

🌐 配置全局代理 http.proxy=http://127.0.0.1:7890 ...
🧭 恢復運行前的代理配置 ...

2️⃣ 自動檢測或創建遠程倉庫

腳本調用 GitHub API,自動檢查目標倉庫是否存在。
如果不存在,將使用你的 Token 自動創建:

def create_repo(owner, repo, private, token, org=""):
    url = f"{API}/user/repos"
    payload = {"name": repo, "private": private}
    ...

運行時輸出:

🆕 遠程倉庫不存在,正在創建:user XXY/data_generator(private=False)
✅ 已創建:XXY/data_generator

3️⃣ .gitignore 智能更新 + 腳本自我保護

腳本自動在 .gitignore 中添加常見忽略項與自身保護:

🧩 已更新 .gitignore(含 .git_bad_*/ 與當前腳本)

關鍵邏輯:

must = {
    "__pycache__/", "*.pyc", "*.pyo", "*.pyd",
    ".git_bad_*/", ".DS_Store", current_script_name(),
}

👉 這樣一來,腳本本身永遠不會被提交進 Git。

4️⃣ 本地敏感信息掃描

推送前自動掃描工作區中所有文件(排除 .git_bad_* 和腳本自身):

SECRET_PATTERNS = [
    r"ghp_[A-Za-z0-9]{36,}",
    r"AKIA[0-9A-Z]{16}",
    r"ya29\.[0-9A-Za-z\-_]+",
]

若檢測到任何 Token、密鑰或憑據,腳本立即中止推送:

❌ 本地文件中發現可疑密鑰,已阻斷推送。
  - config.py:88 :: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

5️⃣ GH013 自動檢測與歷史清洗

當推送因 GH013 拒絕(Push Protection)時:

  1. 自動解析錯誤日誌中違規路徑;
  2. 調用 git filter-repo 清除對應歷史;
  3. 將匹配到的 Token 片段替換為 ***REMOVED***
  4. 再次執行強制推送。

示例輸出:

🛑 觸發 GitHub Push Protection,開始自動清洗歷史 ...
🧽 正在從歷史中移除路徑:['config.py']
🧽 正在歷史中替換敏感片段:2 條
🔁 重試強制推送(--force-with-lease + extraheader) ...

最終實現自動“去敏化 + 重推”。

6️⃣ 雙模式安全推送機制

✅ 首選方式:Basic extraheader

使用 -c http.extraheader="AUTHORIZATION: Basic <b64(username:token)>" 這種方式不會把 Token 寫入 remote。

🚀 正在推送到遠程(AUTHORIZATION: Basic extraheader) ...
🪖 兜底方式:臨時帶憑據 URL

若 extraheader 被舊版 Git 拒絕,則改為:

git push https://username:TOKEN@github.com/owner/repo.git

此 URL 僅在本次執行有效,不會寫入 .git/config

7️⃣ 索引/對象損壞自愈

當出現 invalid objecterror building trees 錯誤時,腳本自動執行修復:

❗檢測到對象庫/索引損壞,嘗試温和修復 ...
🔎 fsck 結果:OK

若修復失敗,則重建 .git 目錄並保留源碼:

🧯 已備份舊 .git -> .git_bad_20251027_103601

8️⃣ 自動清理舊備份與憑據

執行完畢後,腳本會清除:

  • 所有 .git_bad_* 目錄;
  • Git 憑據緩存;
  • 系統憑據管理器中保存的 Token。

輸出示例:

🚪 正在清空 Git 憑據緩存 ...
🧼 已嘗試清除本地憑據緩存。

🧠 四、腳本執行邏輯概覽

以下為整個流程的邏輯圖(偽代碼式):

def main():
    setup_proxy()
    config_git_user()
    init_or_repair_repo()
    write_gitignore()
    untrack_self()
    preclean_git_bad()
    scan_local_secrets()
    ensure_remote_repo()
    disable_pre_push_hook()
    ensure_commit()
    try_push_with_basic_header()
    if push_protection_triggered:
        clean_and_force_push()
    restore_proxy()
    clear_git_credentials()

🧪 五、使用示例

✅ 運行命令

python git_auto_push.py

✅ 成功輸出示例

✅ 當前目錄:D:\PyCharmMiscProject\data_generator
🌐 配置全局代理 http.proxy=http://127.0.0.1:7890 ...
ℹ️ 已檢測到 Git 倉庫
🧩 已更新 .gitignore(含 .git_bad_*/ 與當前腳本)
🚀 正在推送到遠程(AUTHORIZATION: Basic extraheader) ...
🎉 完成:分支已推送到遠程(未把 Token 寫進 remote 配置)。
🧭 恢復運行前的代理配置 ...
🧼 已嘗試清除本地憑據緩存。

🧱 六、安全設計分析

安全機制

説明

🔐 Token 不落盤

不會出現在 remote、config、歷史中

🧩 自動敏感掃描

防止誤推機密數據

🪣 歷史清洗

支持 git filter-repo 自動去敏

🧭 代理隔離

執行前後恢復系統代理

🧼 憑據清理

清空所有系統憑據緩存

⚙️ 自愈機制

自動修復索引/對象錯誤

💡 核心思想:任何情況下,腳本都不會讓 Token 殘留或泄露。

🧩 七、適用場景

  • 💼 企業/實驗室內網環境,需代理訪問 GitHub
  • 🧪 推送含有大文件或複雜歷史的科研項目
  • 🔒 需要滿足安全合規要求的組織開發
  • 🧰 DevOps CI/CD 自動化腳本
  • 💡 個人想要“一鍵推送、永不出錯”的開發者

🏁 八、總結與展望

這份腳本集成了 Git + GitHub API + 安全掃描 + 代理自動化 + 歷史修復 五大功能,幾乎覆蓋了推送時可能遇到的所有問題。

未來可以進一步擴展:

  • ✅ 支持多倉庫批量推送
  • ✅ 增加日誌系統(.log 文件記錄每次執行)
  • ✅ 與 CI/CD(如 GitHub Actions)聯動
  • ✅ 增強可視化輸出(例如 tqdm 狀態條)

📚 九、附錄:核心參數一覽

參數

默認值

説明

PROJECT_DIR

項目目錄

本地項目路徑

BRANCH

main1

推送分支

GIT_USER_NAME

用户名

Git 用户配置

GITHUB_TOKEN

明文 Token

用於 API 與推送

HTTP_PROXY_URL

127.0.0.1:7890

GitHub 訪問代理

IS_PRIVATE

False

是否創建私有倉庫

ORG_NAME

""

若為空則使用個人賬户

🧠 十、結語

這不是一個簡單的 Git 腳本,而是一個 安全、智能、自愈的自動推送系統

它讓所有開發者都能用一句命令完成從代理配置到推送成功的全流程。

一句話總結:
“讓 Git 推送像呼吸一樣自然,但比呼吸更安全。”