Migrating from Vault to Git
This tutorial walks you through migrating from a legacy Hex-Rays Vault repository to a new Git-based repository.
During the migration, you can choose to move all IDBs into a single repository, or migrate each IDB individually into its own repo.
The legacy Vault backend is planned for deprecation in future releases.
Prerequisites
A Git client installed
The Vault to Git migration utility — available from the Download Center under teams
An active IDA Pro subscription with the Teams Add-on
The
git-idaclean filter onPATH. It ships with IDA Pro 9.4+; verify with:git-ida versionRead access to your existing Vault server's data:
The vault SQLite database file (typically
hexvault.sqlite3)The vault file storage directory — the same path your Vault server was launched with (the value of its
-d/--vault-dirflag)
A destination Git server you can push to (GitHub, GitLab, Gitea, Bitbucket, etc.).
The migration replays Vault history from scratch, so each destination repository must be empty — no README, no .gitignore, no initial commit.
If you don't already run a Git server on-premise, see Recommended Git Server Setup for a lightweight Gitea-based option.
A machine to run
vault2giton with:Enough free disk space for the output Git repository — plan for roughly 2× the size of your vault data
Enough RAM to comfortably hold the largest single IDB in memory while the
git-idaclean filter processes it (16 GB is comfortable for typical vaults; very large vaults benefit from more)
Before You Begin
Stop active vault sessions. No analyst should be checking files into the vault while the migration runs — any check-ins made during the run will not be captured.
Decide on a migration layout.
LayoutWhen to useAll IDBs in one repository
Smaller teams, related projects, simplest workflow
One IDB per repository
Independent projects with separate access controls or different teams
Prepare the destination Git server. Create one empty repository (single-repo layout) or one empty repository per IDB (per-IDB layout).
Verify SSH (or HTTPS) access to the destination from the machine that will run
vault2git:
Migration Steps
The examples below assume you've set a few environment variables to keep commands short:
1. Inspect the vault
List every IDB tracked in the vault. This is read-only — it makes no changes:
You should see entries like:
If the listing is empty or doesn't match what you expect, double-check --vault-dir and --db against your Vault server configuration before continuing.
2. Run the migration
Pick the option that matches the layout you decided on.
Option A — All IDBs into a single repository
The utility will:
Initialize a fresh Git repository at
$GIT_REPO.Walk the Vault history chronologically.
Create one Git commit per Vault check-in, preserving the original author, timestamp, and commit message.
Push each commit to the remote as it completes (
--push).
A full transcript is written to migration.log and also streamed to your terminal.
Option B — One IDB per repository
For this layout, run vault2git --file <vault-path> once per IDB, each into its own output directory and remote:
Repeat for each IDB you saw in step 1. A small shell loop driven by the output of --list-files is the easiest way to script this.
3. Useful options
--verbose
Print extra per-commit progress, including the file currently being reconstructed. Recommended for large vaults.
--log PATH
Tee all output to a log file in addition to the terminal. Recommended for any non-trivial migration.
--lfs
Initialize the output repository with Git LFS. Use only if your Git server supports LFS and your team is set up to work with it.
--resume
Resume an interrupted migration; see Resuming a Migration below.
4. Verify the result
When vault2git reports Migration complete, sanity-check the new repository.
Count commits and inspect the most recent ones:
Spot-check the history of an individual IDB:
Finally, clone the remote into a fresh directory and open the IDB in IDA Pro through the Teams Git integration to confirm everything works end-to-end.
5. Switch your team to the Git workflow
Once you're satisfied with the verification:
Decommission the old Vault server, or set it to read-only.
Have each analyst clone the new Git repository.
Open IDBs through the IDA Pro Teams Git integration. From this point on, all check-ins go to Git rather than the Vault.
Resuming a Migration
Migrations of large vaults can take many hours. If vault2git is interrupted (system reboot, network drop, etc.), restart it with --resume:
--resume reads the small state file .git/vault2git-state inside the output repository, skips every Vault commit that's already been replayed, and picks up exactly where it left off. Always prefer --resume over starting from scratch — unless you've upgraded the vault2git binary mid-migration, in which case start fresh.
Troubleshooting
Error: --vault-dir does not contain expected file directories.
Error: --vault-dir does not contain expected file directories.The path passed to --vault-dir must be the same path your Vault server was launched with. The utility prints a hint listing candidate subdirectories — follow the hint.
Error: git-ida is not installed or not in PATH.
Error: git-ida is not installed or not in PATH.The git-ida clean filter ships with IDA Pro 9.4+. Make sure the directory containing it is on your PATH, then verify with git-ida version.
Error: remote is not reachable.
Error: remote is not reachable.Verify access with git ls-remote $REMOTE_URL. Common causes: the SSH key on the migration machine isn't authorized on the destination server, or the destination repository doesn't exist yet.
Initial push rejected
The destination repository must be empty. Re-create it without auto-initialization (no README, no .gitignore), then re-run with --resume.
WARNING: removing stale index.lock (previous vault2git run was interrupted)
WARNING: removing stale index.lock (previous vault2git run was interrupted)This is normal recovery output when restarting after a previous run was killed mid-stage. No action required.
A few files failed to stage
If the migration log shows messages like IDB file(s) failed to stage (clean filter error?), the corresponding git add failed: lines immediately above identify the affected files and the underlying error. Fix the cause (typically missing or corrupt vault blobs) and re-run with --resume to retry only the missing commits.
Command Reference
--vault-dir DIR
yes
Vault file storage directory
--db PATH
yes
Path to the Vault SQLite database
--git-repo DIR
yes (unless --list-files)
Output Git repository directory
--push URL
no
Push to a remote after each commit
--file PATH
no
Migrate a single Vault path (e.g., //project/file.i64)
--list-files
no
Print every Vault file path and exit
--lfs
no
Initialize Git LFS in the output repository
--resume
no
Resume an interrupted migration
--log PATH
no
Tee all output to a log file
--verbose
no
Detailed progress output
--version
no
Print version and exit
--help
no
Print usage and exit
Last updated
Was this helpful?
