
Day 01 講過這個系列的核心心法:
攔截 → 追問 → 親手重做
從今天開始,我會一個一個把實際遇到的攔截點記下來。
第一個,就是 Claude Code 要幫我建立 Git 版控的時候。
AI 說「我幫你把專案納入版控」的時候,有什麼好問的?
git init 看起來很簡單。
建立一個 Git repository,還能出什麼問題?
但這次真正讓我停下來的,不只是 git init,還有它後面建立的 .gitignore。
尤其是 Godot 專案裡的 .uid 檔案。
這些檔案看起來都是自動產生的,但用途完全不同。如果搞錯了,沒有把需要的檔案加入版控,可能要等到換一台電腦才發現問題。
專案骨架蓋好了,接下來該進版控。
我跟 Claude Code 說:
幫我加上 git 版控
它列出準備執行的工作,然後跳出授權請求:
AI wants to run: git init -b main
這裡就是第一個攔截點。
直接按 Allow 當然可以。
但我這次先停下來問:「-b main 是什麼?不加會怎樣?」
git init -b main 在做什麼?-b 是指定 Git 建立 repository 時,初始分支的名稱。
所以:
git init -b main
就是建立 repository,同時把初始分支命名為 main。
如果不指定,Git 會依照版本和設定使用預設的分支名稱。
我這次直接指定 main,讓本機專案和 GitHub 常見的預設分支名稱一致。
這是一個很小的選擇,但也是我原本可能直接忽略的地方。
Claude Code 在執行 Git 操作前,也會先確認目前所在的位置,以及父層是否已經存在 Git repository。
我一開始不太懂它為什麼要檢查這個。
後來才知道,如果專案放在其他 Git repository 裡面,Git 的工作範圍就可能和自己想像的不一樣。
例如:
Projects/
└── MyGame/
如果 Projects/ 本身已經是 Git repository,而我又在 MyGame/ 裡建立 Git,就可能形成巢狀 repository。
所以在建立版控之前,先確認:
「我現在到底在哪一個 Git repository 裡?」 其實滿重要的。
這也是攔截的其中一個收穫:AI 有時候會先做一些我根本沒想到要檢查的事情。
.gitignore接下來 Claude Code 要建立 .gitignore。這才是今天真正讓我學到東西的地方。
Godot 專案第一次開啟、匯入資源之後,會出現一些自動產生的檔案。
例如:
.godot/ ← 一個資料夾
scripts/Global.gd.uid ← 每支腳本旁邊多一個 .uid
兩個看起來都像「AI 自己產生的東西」。
我的第一個直覺是:
既然是自動產生的,那就全部忽略掉。
結果這個想法是錯的。
.godot/ 和 .gd.uid 完全不同.godot/ |
*.gd.uid |
|
|---|---|---|
| 是什麼 | Godot 編輯器的本機資料,例如匯入資料、快取、編輯器設定 | Godot 用來追蹤腳本的唯一識別資訊 |
| 是否需要提交 | ❌ 忽略 | ✅ 這次保留在版控 |
| 刪掉之後 | Godot 可以重新建立 | 可能造成場景和腳本的 UID 對應問題 |
所以最後 gitignore 的設定是:
# 編輯器本機快取
.godot/
# *.gd.uid 不要忽略
這裡最容易搞錯。
.godot/ 和 .gd.uid 都是自動產生的,但用途完全不同。
自動產生,不代表一定不需要進 Git。
Claude Code 在 .gitignore 裡,不只是寫「忽略什麼」,還特別留下說明:
# 編輯器本機快取:匯入後產生的縮圖、imported/、uid_cache.bin、編輯器版面配置。
# 純本機產物,換一台機器重新匯入即可重建,不進版控。
.godot/
# 注意:*.gd.uid 是 Godot 用來追蹤腳本參考的識別碼,
# 先保留在版控中,避免場景與腳本的連結在其他環境出現問題。
# 故此處不忽略。
我覺得這段註解滿實用,可以直接提醒自己:
這些檔案雖然是自動產生的,不代表一定可以忽略。
同一份 .gitignore 裡,還有幾個設定我一起確認了。
git config core.quotepath false
我的專案裡有像 大綱.md 這種中文檔名。
Git 預設可能會把非 ASCII 路徑顯示成:
\345\244\247\347\266\261.md
看起來很像檔名壞掉了。
設定 core.quotepath false 之後,Git 就會直接顯示中文檔名。
這是 Git 的顯示設定,不是檔案編碼壞掉。
當時:
assets/images/
assets/audio/
這兩個資料夾都是空的。
但 Git 只追蹤檔案,不追蹤空目錄。
所以我各放了一個:
.gitkeep
讓這兩個資料夾可以先存在。
等之後真的放入圖片和音效素材,就可以把 .gitkeep 刪掉。
/build/
/export/
*.pck
*.zip
export_credentials.cfg
當時遊戲還沒有開始匯出,但我先把這些檔案排除。
後面 Day 26 做三平台匯出時,build/ 裡會出現比較大的建置檔案。如果不小心一起 commit 進 Git,repository 就會變得很肥。
export_credentials.cfg 這類匯出相關的敏感檔案,這次也先排除,避免把不該進版控的資訊一起提交。
追問完,還是要自己確認 Claude Code 真的設對了。
我用了三個指令。
.godot/ 被忽略git check-ignore -v .godot/uid_cache.bin
它會告訴我這個檔案是被 .gitignore 的哪一條規則擋下來的。
例如:
.gitignore:5:.godot/ .godot/uid_cache.bin
.uid 有進版控git ls-files "*.uid"
結果可以看到:
scripts/Card.gd.uid
scripts/Global.gd.uid
代表這些檔案有被 Git 追蹤。
git status --short --branch
例如:
## main
代表目前在 main 分支,而且沒有其他未提交的變更。
這三個指令不難,但可以讓我不用只相信 AI 說「都設定好了」。
我自己跑一次,就知道目前的狀態。
今天主要確認了幾件事情:
看到 AI 執行指令時,先看參數。
這次只是多問了一個 -b main,就知道了 Git 初始分支的設定。
看到自動產生的檔案,不要直接全部忽略。
.godot/ 和 *.gd.uid 的用途不同。
AI 做完,我自己確認一次。
git check-ignore、git ls-files、git status 都可以拿來確認目前的 Git 狀態。
這次攔截之後,我多知道了一件原本不知道的事:
自動產生的檔案,不一定都該忽略。
那天的開發日誌裡,我還留了一個待確認事項:
commit 訊息要固定用中文敘述式,還是改成 Conventional Commits(
feat:/fix:)?
當時 Git 只有第一筆 commit,所以我寫了一句:
現在只有一筆,要改趁早。
後來我確定採用 Conventional Commits。
翻現在的 git log,可以看到:
feat:
chore:
docs:
balance:
這個決定因為很早做,所以後面不需要回頭修改大量 commit。
明天 Day 07,我們再處理一個個資的問題:
我的真實 email 出現在 commit 裡。
而且已經推出去的那些 commit,並不會因為後來修改 Git 設定就自動消失。