Skip to content

Praqma/dir2git-importer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

simple-dir2git-migrator

Convert a directory of timestamped snapshot directories into a proper Git repository using git fast-import — the method described in Pro Git §9.2 – Custom Importer.

Requirements

  • bash ≥ 3.2
  • git ≥ 2.0 (2.28+ recommended for --initial-branch support)
  • Standard POSIX tools: find, sort, wc, grep, date

Source directory structure

Each subdirectory of your source directory becomes one Git commit.

Supported naming patterns:

  • Date-based snapshots: subdirectory name contains YYYY-MM-DD (prefix, suffix, or embedded)
  • Release-style snapshots: subdirectory name matches Vx.y.z (for example V5.6.0), similar to zip-integration release folders

Date-based example:

/backups/myproject/
├── 2024-01-02/
├── backup-2024-01-14/
├── my-project-2024-02-03-hotfix/
└── current/           ← receives today's timestamp

Release-style example:

/backups/myproject/
├── V5.6.0/
├── V5.7.0/
└── V5.10.0/

Ordering rules:

  • Date-based snapshots are ordered chronologically by extracted date.
  • Release-style snapshots are ordered by semantic version.
  • A directory named exactly current receives today's date.
  • Subdirectories matching neither pattern are skipped with a warning.

Quick start

./dir2git.sh --source /backups/myproject \
             --author "Jane Doe" \
             --email  jane@corp.com

This creates ./target_repo/ containing the full imported history.

Usage

Usage: dir2git.sh [OPTIONS]

OPTIONS
  --source DIR      Directory containing snapshot subdirectories  [required]
  --target DIR      Output path for the new git repo  [default: ./target_repo]
  --author NAME     Committer name
  --email EMAIL     Committer email
  --timezone TZ     UTC offset, e.g. +0200 or -0500  [default: +0000]
  --branch NAME     Target branch name  [default: main]
  --config FILE     Config file path  [default: dir2git.conf next to script]
  --dry-run         Print the fast-import stream to stdout; do not import
  -h, --help        Show help

Config file

Copy dir2git.conf and edit it — useful when migrating multiple projects or automating runs. CLI arguments always override config values.

./dir2git.sh --config /path/to/myproject.conf
Variable Description
SOURCE_DIR Path to directory containing snapshots
TARGET_DIR Output path for the new git repo
AUTHOR_NAME Committer name
AUTHOR_EMAIL Committer email
TIMEZONE UTC offset applied to all commits (e.g. +0200)
BRANCH Target branch name
COMMIT_MSG_TEMPLATE Message template; {dir} and {date} are substituted
DATE_REGEX ERE used to extract YYYY-MM-DD from directory names
RELEASE_REGEX ERE used to match release-style directories (default Vx.y.z)
GITIGNORE_PATTERNS Newline-separated patterns to write into .gitignore

Example config

SOURCE_DIR="/backups/myproject"
TARGET_DIR="/repos/myproject"
AUTHOR_NAME="Jane Doe"
AUTHOR_EMAIL="jane@corp.com"
TIMEZONE="+0200"
BRANCH="main"
COMMIT_MSG_TEMPLATE="snapshot: {dir} ({date})"
RELEASE_REGEX="^[Vv][0-9]+\.[0-9]+\.[0-9]+$"
GITIGNORE_PATTERNS=$'*.log\n*.tmp\n.DS_Store'

Features

Feature Notes
Chronological ordering Dates extracted from directory names
Configurable author & timezone Per-project config file or CLI
Custom commit message Template with {dir} and {date}
Executable file detection Files with execute permission → mode 100755
Symbolic link preservation Mode 120000, stores link target
.gitignore generation Optional post-import commit
Dry-run mode Inspect the stream before importing
Dual source-import pattern Supports both date-based and Vx.y.z release directories
Safe partial-import cleanup Target directory removed on failure
Paths with spaces C-style quoting applied automatically

Dry run

Preview the fast-import stream without creating a repository:

./dir2git.sh --source /backups/myproject --dry-run

Validate the stream syntax without writing objects (if your Git build supports it):

./dir2git.sh --source /backups/myproject --dry-run \
    | git fast-import --dry-run

If git fast-import --dry-run is unavailable in your environment, you can still sanity-check stream generation with:

./dir2git.sh --source /backups/myproject --dry-run > /tmp/dir2git.stream

After import

# View history
git -C target_repo log --oneline

# Push to a remote
git -C target_repo remote add origin git@github.com:you/myproject.git
git -C target_repo push origin --all

Limitations

  • Binary files: Very large binary files will be fully buffered in the fast-import stream. For repositories with many large assets, consider Git LFS after import.
  • Filenames with newlines: Unusual but possible on some filesystems; such paths are not handled correctly.
  • Incremental imports: Each snapshot is imported as a complete file-set snapshot (deleteall strategy). This matches the book's approach and is simpler than tracking deltas.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages