chore: 將所有須一的程式碼寫入單一文字檔, 方便提供給Gemini AI分析。
This commit is contained in:
parent
e9b07ddadc
commit
d0d80b26ac
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,95 @@
|
|||
import os
|
||||
|
||||
# ==========================================
|
||||
# 設定區
|
||||
# ==========================================
|
||||
# 輸出的合併檔案名稱
|
||||
OUTPUT_FILE = "all_code.txt"
|
||||
|
||||
# ⚠️ 嚴格排除的資料夾 (完全不掃描這些目錄)
|
||||
EXCLUDE_DIRS = {
|
||||
"__pycache__",
|
||||
".git",
|
||||
".vscode", # VS Code 設定檔
|
||||
".continue", # Continue.dev 設定檔
|
||||
"cmts_api_env", # 🚨 Python 虛擬環境 (極度重要!絕對要排除)
|
||||
"venv", # 其他常見的虛擬環境名稱
|
||||
".venv",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"build"
|
||||
}
|
||||
|
||||
# ⚠️ 排除的檔案副檔名 (不讀取這些格式)
|
||||
EXCLUDE_EXTENSIONS = {
|
||||
".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg", # 圖片
|
||||
".pyc", ".pyo", ".pyd", # Python 編譯檔
|
||||
".exe", ".dll", ".so", ".dylib", # 執行檔/函式庫
|
||||
".zip", ".tar", ".gz", ".rar", # 壓縮檔
|
||||
".pdf", ".doc", ".docx", # 文件檔
|
||||
".sqlite3", ".db" # 資料庫
|
||||
}
|
||||
|
||||
# ⚠️ 排除的特定檔案名稱 (例如腳本自己、隱藏檔等)
|
||||
EXCLUDE_FILES = {
|
||||
"merge_code.py", # 排除這支腳本自己
|
||||
"all_code.txt", # 排除輸出的檔案
|
||||
".DS_Store", # Mac 系統檔
|
||||
".clineignore", # AI 輔助工具的忽略檔
|
||||
".clinerules", # AI 輔助工具的規則檔
|
||||
".gitignore", # Git 忽略檔
|
||||
"requirements.txt" # 依賴清單 (通常不需要給 AI 看,除非你要問套件問題)
|
||||
}
|
||||
|
||||
def should_process_file(filename):
|
||||
"""判斷該檔案是否應該被處理"""
|
||||
if filename in EXCLUDE_FILES:
|
||||
return False
|
||||
|
||||
ext = os.path.splitext(filename)[1].lower()
|
||||
if ext in EXCLUDE_EXTENSIONS:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def merge_files():
|
||||
# 取得當前腳本所在的目錄 (專案根目錄)
|
||||
root_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
with open(OUTPUT_FILE, "w", encoding="utf-8") as outfile:
|
||||
# 寫入一個總標題
|
||||
outfile.write("=" * 80 + "\n")
|
||||
outfile.write("PROJECT SOURCE CODE EXPORT\n")
|
||||
outfile.write("=" * 80 + "\n\n")
|
||||
|
||||
# 走訪目錄
|
||||
for dirpath, dirnames, filenames in os.walk(root_dir):
|
||||
# 排除不需要的目錄 (原地修改 dirnames 列表,os.walk 就不會進去)
|
||||
dirnames[:] = [d for d in dirnames if d not in EXCLUDE_DIRS]
|
||||
|
||||
for filename in filenames:
|
||||
if should_process_file(filename):
|
||||
file_path = os.path.join(dirpath, filename)
|
||||
# 計算相對路徑 (例如: routers/config.py)
|
||||
rel_path = os.path.relpath(file_path, root_dir)
|
||||
|
||||
try:
|
||||
with open(file_path, "r", encoding="utf-8") as infile:
|
||||
content = infile.read()
|
||||
|
||||
# 寫入漂亮的檔名標籤
|
||||
outfile.write("\n" + "=" * 80 + "\n")
|
||||
outfile.write(f"FILE: {rel_path}\n")
|
||||
outfile.write("=" * 80 + "\n")
|
||||
# 寫入檔案內容
|
||||
outfile.write(content)
|
||||
outfile.write("\n")
|
||||
|
||||
print(f"✅ 已合併: {rel_path}")
|
||||
except Exception as e:
|
||||
print(f"❌ 讀取失敗 {rel_path}: {e}")
|
||||
|
||||
print(f"\n🎉 合併完成!所有程式碼已儲存至: {OUTPUT_FILE}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
merge_files()
|
||||
Loading…
Reference in New Issue