Project Directory

The ProjectDirectory class enables analysis across multiple Git repositories. It can aggregate metrics and insights from multiple repositories into a single output.

Overview

The ProjectDirectory class provides:

  • Analysis across multiple repositories

  • Aggregated metrics and statistics

  • Project-level insights

  • Multi-repository bus factor analysis

  • Consolidated commit history and blame information

Creating a ProjectDirectory

You can create a ProjectDirectory object in three ways:

Directory of Repositories

Create a ProjectDirectory from a directory containing multiple repositories:

from gitpandas import ProjectDirectory
project = ProjectDirectory(
    working_dir='/path/to/dir/',
    ignore_repos=['repo_to_ignore'],
    verbose=True,
    default_branch='main'  # Optional, will auto-detect if not specified
)

The ignore_repos parameter can be a list of repository names to exclude. This method uses os.walk to search for .git directories recursively.

Explicit Local Repositories

Create a ProjectDirectory from a list of local repositories:

from gitpandas import ProjectDirectory
project = ProjectDirectory(
    working_dir=['/path/to/repo1/', '/path/to/repo2/'],
    ignore_repos=['repo_to_ignore'],
    verbose=True,
    default_branch='main'  # Optional, will auto-detect if not specified
)

Explicit Remote Repositories

Create a ProjectDirectory from a list of remote repositories:

from gitpandas import ProjectDirectory
project = ProjectDirectory(
    working_dir=['git://github.com/user/repo1.git', 'git://github.com/user/repo2.git'],
    ignore_repos=['repo_to_ignore'],
    verbose=True,
    default_branch='main'  # Optional, will auto-detect if not specified
)

Available Methods

Core Analysis

# Commit history across repositories
project.commit_history(
    branch=None,          # Branch to analyze
    limit=None,           # Maximum number of commits
    days=None,           # Limit to last N days
    ignore_globs=None,   # Files to ignore
    include_globs=None   # Files to include
)

# File change history across repositories
project.file_change_history(
    branch=None,
    limit=None,
    days=None,
    ignore_globs=None,
    include_globs=None
)

# Blame analysis across repositories
project.blame(
    rev="HEAD",          # Revision to analyze
    committer=True,      # Group by committer (False for author)
    by="repository",     # Group by 'repository' or 'file'
    ignore_globs=None,
    include_globs=None
)

# Bus factor analysis across repositories
project.bus_factor(
    by="repository",     # How to group results
    ignore_globs=None,
    include_globs=None
)

Common Parameters

Most analysis methods support these filtering parameters:

  • branch: Branch to analyze (defaults to repository’s default branch)

  • limit: Maximum number of commits to analyze

  • days: Limit analysis to last N days

  • ignore_globs: List of glob patterns for files to ignore

  • include_globs: List of glob patterns for files to include

  • by: How to group results (usually ‘repository’ or ‘file’)

API Reference