Git の設定と .gitignore を適用する

create-tauri-app が作る 2 つの .gitignore、target と gen/ の扱い、Cargo.lock をコミットする理由、Windows で混ざる CRLF を .gitattributes で揃える手順。

環境構築 対象: Tauri 2.x 更新日: 読了目安: 約7分 env-016
目次
  1. 前提条件
  2. 1. 生成される 2 つの .gitignore を確認する
  3. 2. src-tauri/target と gen/ の扱い
  4. 3. Cargo.lock と package-lock.json はコミットする
  5. 4. 改行コードを .gitattributes で揃える
  6. 動作確認
  7. よくあるエラーと対処法
  8. src-tauri/target をコミットしてしまった
  9. 「warning: in the working copy of '…', LF will be replaced by CRLF the next time Git touches it」
  10. clone した直後に capabilities の JSON で補完が効かない
  11. OS ごとの違いと注意点
  12. 関連レシピ

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 本体はリポジトリの外に置きます。

関連レシピ

参考リンク(公式ドキュメント)

Web Ninja

この記事を書いた人

Web Ninja ウェブエンジニア (Web Engineer)

会社員ネットワークエンジニアから独立してかれこれ 25 年以上 Web エンジニアとして活動中。普段は JavaScript と Node.js を自在に操り、時には C++ や Perl といった古流の技も嗜みます。近年は Tauri × Rust という新たな武器を手に、デスクトップアプリ開発の最前線を駆け抜けています。「作りたい」を「作れる」に変えるための、実践的な「技」をお届けします。

お問い合わせ: tauri.ninja@gmail.com

内容の誤り・動かないコードを報告する