name: office-git-init description: Use when first setting up a folder that contains Word/Excel/PowerPoint files (.docx/.xlsx/.doc/.xls/.pptx) for human-AI collaboration — a new document project, a folder with no git repo, or one where git diff shows only "Bin 35533 -> 35565 bytes" instead of what changed inside the document.
本 skill 是一次性的初始化工具。 跑完
init_workspace.py,協作紀律就寫進了 目標專案的CLAUDE.md(無條件載入,不依賴本 skill 觸發),日常工作照那份走即可, 不必再回來讀這裡。下面的內容是初始化會裝進專案的東西,以及為什麼這麼裝。
二進位制辦公文件(.docx/.xlsx)的協同有兩個特有陷阱,程式碼檔案上不存在:
Bin 35533 -> 35565 bytes,說不出改了哪一段、哪個單元格。核心原則:磁碟上的檔案是唯一事實;改前先看差異,改後立刻留痕。
~$xxx.docx 鎖檔案不適用:純文本/程式碼檔案(git 原生可 diff);只讀不改的場合。
接手任何放著 Office 文件的資料夾,第一件事就是跑這條。 沒有它,後面的
"先 diff"根本無從談起——git 對二進位制文件只會說 Bin 35533 -> 35565 bytes。
cd <目標資料夾>
python <本skill目錄>/init_workspace.py
冪等,重複跑安全。它會:git init → 裝 .gittools/office2txt.py 並配好 textconv
→ 寫 .gitattributes(Office 檔案掛 textconv)和 .gitignore(排除 ~$ 鎖檔案)
→ 把現有文件提交為"基線版本"。初始化前先查鎖,有文件開著會提示,避免把
半截狀態存成基線。
配好之後的效果:
$ git diff -- 季度總結.docx
-收入 100 萬元,支出 80 萬元。
+收入 120 萬元,支出 90 萬元。
$ git diff -- 明細表.xlsx
- A2=收入 | B2=100
+ A2=收入 | B2=150
已有歷史的資料夾:指令碼不會自動提交已存在的改動,只提示你確認後自行提交—— 避免把別人未完成的活當成基線。
這四步是一個整體,缺任何一步都會在協同時出事。
ls ~$* 2>/dev/null # 有輸出 = 可能正開著
~$ 檔案常在 Office 異常退出後殘留,見到它先別停,做兩項判定:
try: # ① 能獨佔開啟 = 無程序持有
open(doc, "r+b").close(); free = True
except PermissionError:
free = False
② 查 Office 程序實際開著哪些檔案(視窗標題或命令列)。
Device or resource busy(好情況,至少你知道失敗了),或寫成功但隨後被使用者
的儲存動作整體覆蓋(壞情況,無聲無息,幾百處改動瞬間歸零)。git status --short
git diff -- "<檔名>"
絕不拿自己早先的副本當"檔案現在的樣子"。 使用者隨時在改,你 scratchpad 裡的 副本在他碰檔案那一刻就過期了——它只能證明"我改過什麼",不能證明"檔案現在是什麼"。
用 python-docx / openpyxl 做定點修改;格式複雜的表格優先用 Office COM 原地改。 改之前先斷言原值,防止改錯行:
小蔥技能站7w4.net每天更新,海量AI技能等你發現。
assert "35 萬元" in para.text, "原值不符,已被他人改動,停止"
git add -A && git commit -m "誰改的 + 改了什麼 + 為什麼"
不提交的代價:使用者的手工改動和你的改動混成一團,無法區分、無法回滾到中間點。 基線測試中 3/3 的代理都完成了任務卻沒有一個提交,正是這個坑。
| 你要做的事 | 命令 |
|---|---|
| 看文件現在什麼樣 | git diff -- "<檔案>"(已配 textconv) |
| 看某次改動 | git diff HEAD~1 HEAD -- "<檔案>" |
| 取出歷史版本另存(不覆蓋當前) | git show HEAD~2:"<檔案>" > 舊版.docx |
| 回滾到上一版(會覆蓋,慎用) | git checkout HEAD~1 -- "<檔案>" |
| 檔案被鎖又必須記錄版本 | git hash-object -w + update-index --cacheinfo + commit-tree |
| 做法 | 後果 | 正確做法 |
|---|---|---|
| 拿早先的副本當現狀判斷依據 | 把使用者的改動誤判成"資料丟失",白排查半天 | 只認 git diff 和磁碟檔案 |
| 把備份存進會話臨時目錄 | 換個會話就沒了,等於沒備份(基線測試中 2/3 犯此錯) | 備份進專案目錄,或乾脆用 git commit 代替備份 |
| 文件開著照樣寫盤 | 使用者一儲存,你的改動全沒,無報錯 | 先讓使用者關閉 |
| 改完不提交 | 兩人的改動混在一起,無法區分和回滾 | 每個節點提交,資訊寫清依據 |
| 用 Office COM 開啟"只讀"看一眼就以為沒變 | COM 開啟即回寫(實測腳註 id 被重排) | 開啟驗證後重新提交快照 |
| 直接覆蓋單元格公式 | 破壞表內勾稽 | 先讀 data_only=False 看清是值還是公式 |
| 靠指令碼"全綠"就宣佈沒問題 | 指令碼只驗它寫死的那些項 | 指令碼 + git diff 逐字看,兩者都要 |
wps.exe 是常態,鎖檔案殘留很普遍。殘留鎖(正文已移走/
已關閉)可刪,刪前用獨佔開啟測一下:open(doc,'r+b') 成功即無程序佔用。.doc/.xls 舊格式:python-docx/openpyxl 讀不了,只能用 Office COM。xlrd 報 Workbook is encrypted,用 Excel COM 開啟並傳空密碼
(Password="")避免彈模態框卡死。SaveAs2 會卡死:改用直接讀 Paragraphs.Item(i).Range/Format。RPC_E_CALL_REJECTED:多半是 Office 彈了模態框(如首次執行的
"接受許可協議")。列舉視窗找出來讓使用者點掉,不要盲目重試。git diff這是一個構思巧妙、做得很用心的工具——讓 AI 改文件變得"看得見、退得回",文件質量高、說明寫得清楚,初始化一次後就能自動生效,同事也能輕鬆上手。不過在未安裝依賴時會直接報錯,缺少一步到位的提示,對新手不夠友好。核心功能紮實,但穩定性細節還需打磨。