Tauri のプロジェクトには、フロントエンド (Node.js) と Rust の 2 種類のビルド生成物が同居します。create-tauri-app は両方の .gitignore を用意しますが、git init まではしません。最初のコミットの前に、何が除外されているかを確かめ、ロックファイルと改行コードの扱いを決めておきます。
前提条件
- Git が入っていること (
git --version)。Windows では Git for Windows を想定します。 create-tauri-appかtauri initで作ったプロジェクト (Tauri プロジェクトを作成する)。
1. 生成される 2 つの .gitignore を確認する
.gitignore はプロジェクト直下と src-tauri/ の 2 か所にあります。直下はフロントエンドのテンプレート (Vite) のもので、Vanilla + TypeScript なら次の内容です。
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
src-tauri/.gitignore は Tauri 側のもので、src-tauri/target と src-tauri/gen/schemas だけを除外します。tauri init で後付けした場合も同じ 2 つを除外するファイルが作られますが、直下の .gitignore は元のままです。
# Generated by Cargo
# will have compiled files and executables
/target/
# Generated by Tauri
# will have schema files for capabilities auto-completion
/gen/schemas
見落としやすいのは、.env が除外されていないことです (*.local で .env.local は除外されます)。また .vscode/* は extensions.json 以外を除外するので、VS Code 拡張機能の推奨設定 の settings.json などを共有するなら ! で戻します。
.env
.env.*
!.env.example
!.vscode/settings.json
!.vscode/launch.json
2. src-tauri/target と gen/ の扱い
src-tauri/target/ は Cargo のビルド結果の置き場で、tauri build のインストーラーもここにできます。プラグインを十数個入れたプロジェクトでは 1.7 GB ほどになります。Cargo のワークスペースにすると target/ は直下にできるので、直下の .gitignore に /target/ を足します。
| パス | 作られるとき | コミット |
|---|---|---|
src-tauri/gen/schemas/ | ビルドのたび | しない |
src-tauri/gen/android/ | tauri android init | する |
src-tauri/gen/apple/ | tauri ios init | する |
gen/schemas/ は capabilities の入力補完用のスキーマで、ファイル名に OS 名が入り (Windows なら windows-schema.json)、プラグインを足すたびに変わります。gen/android/ と gen/apple/ は Android Studio / Xcode のプロジェクトで、手で直すこともあるのでコミットします。gen/android/ には専用の .gitignore があり、署名の設定 (key.properties など) は除外済みです。
3. Cargo.lock と package-lock.json はコミットする
Cargo.toml の tauri = { version = "2" } は「2.x の最新」という範囲の指定で、実際の版は src-tauri/Cargo.lock に数百のクレートぶん記録されています。これが無いと、clone した人や CI はその日の最新の組み合わせでビルドし、配布物を作った版を再現できません。package-lock.json も同じ理由でコミットし、CLI の版もこれで揃います (Tauri v2 CLI ツールをインストールする)。
CI ではロックファイルを書き換えないコマンドを使います。--locked は Cargo.lock の更新が必要なときにエラーで止まるので、コミット漏れに気づけます。
npm ci
cd src-tauri
cargo check --locked
4. 改行コードを .gitattributes で揃える
Windows で create-tauri-app を実行すると、テンプレート由来のファイル (index.html、tauri.conf.json、main.rs など) は CRLF になり、Cargo が書く Cargo.lock は LF です。さらに Git for Windows は、既定のインストールで core.autocrlf=true を設定します。
git config --show-origin --get core.autocrlf
# file:C:/Program Files/Git/etc/gitconfig true
この設定が人によって違うと「全行が変更された」差分が生まれます。最初の git add の前にリポジトリ直下へ .gitattributes を置いて決めます。こちらが core.autocrlf より優先されます。
* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.png binary
*.ico binary
*.icns binary
text=auto はテキストと判定したファイルだけを対象にし、eol=lf で作業ツリーも LF にします (.bat / .cmd は CRLF でないと誤動作することがあるので例外)。ただし CRLF で書かれた手元のファイルは、コミットしても CRLF のまま残ります。最初のコミットの直後に次を実行すると LF で取り出し直せます (未コミットの変更は消えるので、必ずコミット直後に)。運用中のリポジトリに後から足すときは、先に git add --renormalize . でコミットし直します。
git rm -r -q --cached .
git reset --hard
動作確認
git init と git add . の後、git status --short に node_modules/ と src-tauri/target/ が無いことを見てからコミットします。除外しているルールは git check-ignore -v で「ファイル:行番号:パターン」の形で分かります。
git check-ignore -v src-tauri/target src-tauri/gen/schemas node_modules .env
src-tauri/.gitignore:3:/target/ src-tauri/target
src-tauri/.gitignore:7:/gen/schemas src-tauri/gen/schemas
.gitignore:10:node_modules node_modules
.env の行が無いのは、除外されていないという意味です。改行は git ls-files --eol で、リポジトリ内 (i/) と作業ツリー (w/) の両方が lf なら揃っています。
i/lf w/lf attr/text=auto eol=lf src-tauri/src/main.rs
よくあるエラーと対処法
src-tauri/target をコミットしてしまった
.gitignore は追跡中のファイルには効きません。git rm -r --cached src-tauri/target でインデックスからだけ外してコミットします (手元のファイルは消えません)。.env も同じ手順で外せますが、履歴には残るので先にキーを無効にします。
「warning: in the working copy of '…', LF will be replaced by CRLF the next time Git touches it」
core.autocrlf=true の環境で LF のファイル (Cargo.lock など) を git add したときの警告で、エラーではありません。.gitattributes で eol=lf にするとこの警告は消え、代わりに CRLF のファイルで「CRLF will be replaced by LF」と出ます。手順 4 の取り出し直しをすれば出なくなります。
clone した直後に capabilities の JSON で補完が効かない
$schema が指す ../gen/schemas/desktop-schema.json は除外しているので clone 直後には無く、一度 npm run tauri dev か cargo check を実行すると作られます。
OS ごとの違いと注意点
- Windows:
core.autocrlf=trueが既定で、create-tauri-appの出力も CRLF です (準備は Hello World (Windows))。 - Windows / macOS: ファイル名の大文字・小文字を区別しないので、
Icon.pngをicon.pngにする変更はgit mvで行います。.DS_Storeは除外済みです。 - 署名用の鍵: アップデーターの秘密鍵や Android の keystore 本体はリポジトリの外に置きます。
