Tooling for Godot to help with development
  • C++ 55.8%
  • GDScript 41%
  • Python 2.1%
  • Shell 1%
Find a file
picklemustard 6a24f33e9a
Fix LFS status/push for git-lfs CLI repos and pull/lock log errors
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>
2026-10-14 15:04:02 -04:00
addons Fix LFS status/push for git-lfs CLI repos and pull/lock log errors 2026-10-14 15:04:02 -04:00
git Fix LFS status/push for git-lfs CLI repos and pull/lock log errors 2026-10-14 15:04:02 -04:00
lfs Fix LFS status/push for git-lfs CLI repos and pull/lock log errors 2026-10-14 15:04:02 -04:00
tests Fix LFS status/push for git-lfs CLI repos and pull/lock log errors 2026-10-14 15:04:02 -04:00
thirdparty Vendor libgit2 as a submodule and build it statically 2026-09-21 19:19:59 -04:00
.gitignore Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
.gitmodules Vendor libgit2 as a submodule and build it statically 2026-09-21 19:19:59 -04:00
build-engine.sh Merge remote-tracking branch 'origin/main' into rename-git-lfs-integration 2026-10-11 15:10:52 -04:00
CLAUDE.md Isolate addon UI from custom editor/project themes 2026-10-14 14:15:39 -04:00
config.py Rescope to Git/LFS integration and rename to git_lfs_integration 2026-10-10 17:55:45 -04:00
DESCRIPTION.bbcode Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
godot-asset.toml Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
icon.png Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
INSTALL.md Rescope to Git/LFS integration and rename to git_lfs_integration 2026-10-10 17:55:45 -04:00
LICENSE Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
package-addon.sh Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
project.godot Rescope to Git/LFS integration and rename to git_lfs_integration 2026-10-10 17:55:45 -04:00
README.md Add Forgejo asset-library manifest, MIT license and packaging script 2026-10-11 15:08:43 -04:00
register_types.cpp Rescope to Git/LFS integration and rename to git_lfs_integration 2026-10-10 17:55:45 -04:00
register_types.h Rescope to Git/LFS integration and rename to git_lfs_integration 2026-10-10 17:55:45 -04:00
SCsub Rescope to Git/LFS integration and rename to git_lfs_integration 2026-10-10 17:55:45 -04:00

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 at modules/git_lfs_integration. Provides GitBackend and every Lfs* class as built-in engine types.
  • Editor addon — addons/git_lfs_integration/. Installed into a consuming project at res://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's addons/ 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 at thirdparty/libgit2 and linked statically. A system libgit2 is only needed with builtin_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.* to gitlfsintegration.*; the old keys are still read as a fallback until re-saved.
  • The LFS manifest moved from .git/dev_tools_lfs_manifest.json to .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).