Shell History Per Project
Shell History Per Project
Section titled “Shell History Per Project”This DevContainer feature provides shell history persistence per project by mounting a shell directory and creating symbolic links internally. This ensures that your shell history is preserved across container rebuilds and is isolated per project.
Features
Section titled “Features”- Per-project history isolation: Each project maintains its own shell history
- Multiple shell support: Supports zsh, bash, and fish shells
- Persistent across rebuilds: History is preserved when containers are rebuilt
- Configurable: Customizable history directory and size limits
- Symbolic link approach: Uses internal symbolic links for seamless integration
Add this feature to your devcontainer.json:
Options
Section titled “Options”| Option | Type | Default | Description |
|---|---|---|---|
shell | string | zsh | Shell type to configure (zsh, bash, or fish) |
historyDirectory | string | /workspaces/.shell-history | Directory where shell history will be persisted |
maxHistorySize | string | 10000 | Maximum number of history entries to keep |
Examples
Section titled “Examples”Basic usage with default zsh
Section titled “Basic usage with default zsh”Custom configuration
Section titled “Custom configuration”With volume mount
Section titled “With volume mount”For persistent history across different development sessions, you might want to add a volume mount:
How it works
Section titled “How it works”- Creates a persistent history directory: The feature creates a dedicated directory for storing shell history files
- Configures shell settings: Updates the shell configuration files to use the persistent history location
- Creates symbolic links: Links the default history file location to the persistent location
- Sets appropriate permissions: Ensures proper file permissions for the remote user
Supported shells
Section titled “Supported shells”- Zsh: Configures
.zsh_historywith optimal history settings includingSHARE_HISTORY,HIST_IGNORE_DUPS, etc. - Bash: Configures
.bash_historywithhistappendand duplicate handling - Fish: Configures
fish_historywith appropriate Fish shell settings
Directory structure
Section titled “Directory structure”After installation, you’ll have:
With symbolic links from the standard locations:
~/.zsh_history→/workspaces/.shell-history/.zsh_history~/.bash_history→/workspaces/.shell-history/.bash_history~/.local/share/fish/fish_history→/workspaces/.shell-history/fish_history
Benefits over global history mounting
Section titled “Benefits over global history mounting”Unlike mounting the user’s global shell history, this approach provides:
- Project isolation: Each project maintains its own command history
- Team collaboration: History can be shared among team members if desired
- Context relevance: Commands are relevant to the specific project
- Clean development: No mixing of personal and project commands
- Flexibility: Easy to configure different settings per project
Comparison with stuartleeks/dev-container-features shell-history
Section titled “Comparison with stuartleeks/dev-container-features shell-history”This feature differs from the existing shell-history feature by:
- Project-scoped: History is isolated per project instead of global user history
- Internal symbolic links: Uses symbolic links internally rather than mounting user’s home directory
- Collaborative: Can be shared with team members through project setup
- Configurable location: Allows customization of where history is stored within the project
Installation and Development
Section titled “Installation and Development”This feature is automatically installed when referenced in a devcontainer.json file. The installation process:
- Creates the specified history directory
- Updates shell configuration files
- Creates symbolic links for seamless integration
- Sets proper permissions for the remote user
Contributing
Section titled “Contributing”This feature is part of the helpers4/devcontainer-features repository. Contributions and issues are welcome!