- C++ 55.8%
- GDScript 41%
- Python 2.1%
- Shell 1%
Files committed by the git-lfs CLI had no plugin manifest entry, so the status scanner classified every LFS file as PENDING_TO_LFS, the remote check skipped them, and LFS Push found nothing to upload. - Add GitBackend.list_lfs_pointers_in_index() and LfsManifest.adopt_pointers(); adopt index pointers whose working file hashes to the pointer oid before status/changes scans (GitLfsManifestUtil). LfsPullService records files it smudges. - Push explains when files match LFS patterns but aren't pointers yet. - Set up the scheme-specific credential provider before lock polls; LfsRemoteClient refuses non-http(s) URLs instead of passing ssh:// to HTTPRequest. - Check the pointer spec line byte-wise (LfsPointer.has_pointer_prefix/ parse_bytes) so binary files are never decoded as UTF-8. - Pull reports only files it actually rewrote; reimport via scan_sources() a frame later instead of reimport_files() inside the deferred flush (progress dialog errors, unknown-importer reimports). - Test: git-lfs-style committed file classifies, remote-checks and pushes; PNG bytes not a pointer; ssh:// lock URL refused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| addons | ||
| git | ||
| lfs | ||
| tests | ||
| thirdparty | ||
| .gitignore | ||
| .gitmodules | ||
| build-engine.sh | ||
| CLAUDE.md | ||
| config.py | ||
| DESCRIPTION.bbcode | ||
| godot-asset.toml | ||
| icon.png | ||
| INSTALL.md | ||
| LICENSE | ||
| package-addon.sh | ||
| project.godot | ||
| README.md | ||
| register_types.cpp | ||
| register_types.h | ||
| SCsub | ||
git_lfs_integration
Deep Git and Git LFS integration for the Godot 4 editor: a C++ engine module (GitBackend + Lfs*, built on a statically linked libgit2) plus an editor addon that adds a Git main-screen tab.
What this is
Two pieces that ship from this one repo:
- Engine module — the repo root (
config.py,SCsub,register_types.{h,cpp},git/,lfs/). Compiled into a custom Godot editor atmodules/git_lfs_integration. ProvidesGitBackendand everyLfs*class as built-in engine types. - Editor addon —
addons/git_lfs_integration/. Installed into a consuming project atres://addons/git_lfs_integration/. Provides the UI on top of the module.
The project.godot at this repo's root is a minimal harness for developing the addon in isolation — it isn't part of what you install.
Features
The Git main-screen tab has a single tab bar:
| Tab | What it does |
|---|---|
| Changes | Status, staging, commit, side-by-side diff, conflict resolver |
| History | Commit graph |
| Branches | Checkout, create, merge |
| Stash | Apply / pop / drop |
| LFS | Files, Changes, Remote objects + locks, Tracking (per-extension LFS patterns), Maintenance (quarantine, rebuild) |
| Settings | Repo (remotes, sync, advanced config), Identity (user + SSH), Ignore/Attributes (.gitignore/.gitattributes editors), LFS (locking) |
The toolbar (fetch / pull / push / branch) is shared across tabs, and a badge in the editor's top toolbar shows incoming remote commits and LFS objects.
Install
Both parts are required for the Git tab to do anything:
- Part A — addon. Merge
addons/git_lfs_integration/into your project'saddons/folder and enable the plugin. - Part B — engine module. Build a Godot editor from source with this repo checked out at
modules/git_lfs_integration.
On a stock editor (Part A only) the addon loads cleanly and shows a "module missing" notice in the Git tab instead of erroring.
See INSTALL.md for step-by-step instructions.
Quick start
git submodule add <this-repo-url> vendor/git_lfs_integration
git submodule update --init --recursive
rsync -a --delete vendor/git_lfs_integration/addons/git_lfs_integration/ addons/git_lfs_integration/
Then in the Godot editor: Project Settings > Plugins > enable "Git LFS Integration". Part B (engine build) is in INSTALL.md.
Requirements
- Godot 4.5+ engine source for Part B
- This repo's submodules initialized (
git submodule update --init --recursive) — libgit2 is vendored atthirdparty/libgit2and linked statically. A system libgit2 is only needed withbuiltin_libgit2=no.
Upgrading from dev_tools
This project was previously named dev_tools (addon at addons/dev_tools/, module at modules/dev_tools_git). Existing repos keep working:
- Git config keys moved from
devtools.*togitlfsintegration.*; the old keys are still read as a fallback until re-saved. - The LFS manifest moved from
.git/dev_tools_lfs_manifest.jsonto.git/git_lfs_integration_manifest.json; the old file is read if present and removed on the next save.
Delete the old addons/dev_tools/ from your project and re-point your engine checkout's module to modules/git_lfs_integration.
Project status
Early (plugin.cfg version 0.1.0). No automated test suite yet — see tests/ for standalone end-to-end scripts.
License
MIT — see LICENSE. The vendored libgit2 submodule (thirdparty/libgit2) keeps its own license (GPLv2 with linking exception).
Contributing / development
See CLAUDE.md for developer/contributor-facing conventions (build commands, architecture notes, UI styling rules, the C++ module build workflow).