# Using Git Repositories in Config Profiles

## Overview

Config profiles now support mounting files and directories from git repositories directly into your tool instances. This is useful for:

- Sharing configuration files across multiple instances
- Mounting dotfiles or development environment configs
- Including shared code or assets from other repositories
- Pinning specific branches or versions of dependencies

## How It Works

When you start a tool instance with a config profile that has git mounts:

1. The system checks if the repository is cloned locally
2. If not cloned and a remote URL is available, it automatically clones the repository
3. If a branch is specified, it checks out that branch
4. Files matching the source path pattern are mounted as bind mounts into the container
5. Instance startup continues normally

## Adding Git Mounts

### Step 1: Select a Repository

In the config profile editor, find the "Git Mounts" section. Choose a repository from the dropdown. Only repositories from your projects are available.

### Step 2: Configure Source Path

The source path determines which files from the repository to mount:

- **`.`** (default): Mount the entire repository
- **`configs/`**: Mount the configs directory
- **`*.json`**: Mount all JSON files in the repository root
- **`src/**/*.py`**: Mount all Python files in the src directory recursively

**Glob patterns are supported** - use `*` for any characters, `**` for recursive matching.

### Step 3: Set Target Path

The target path is where files appear inside the container:

- `/app/config` - Mount to /app/config
- `/home/user/dotfiles` - Mount to user's home directory
- `/workspace/shared` - Mount to workspace shared folder

Target paths must be absolute (start with `/`).

### Step 4: Optional Branch Selection

You can pin a specific branch or tag:

- `main` - Use the main branch
- `develop` - Use the develop branch
- `v1.2.3` - Pin to a specific tag

If not specified, the current checked-out branch is used.

## Examples

### Dotfiles Configuration

Mount your dotfiles repository into the home directory:

```
Repository: dotfiles
Source Path: .
Target Path: /home/user
Branch: main
```

### Shared Configuration Files

Mount only JSON config files from a shared config repo:

```
Repository: shared-configs
Source Path: *.json
Target Path: /app/config
Branch: production
```

### Development Tools Configuration

Mount specific tool configs:

```
Repository: dev-tools
Source Path: vscode/
Target Path: /workspace/.vscode
```

### Multiple Mounts

You can add multiple git mounts to a single profile:

1. Dotfiles → `/home/user`
2. Shared configs → `/app/config`
3. Assets → `/app/static`

## Profile Includes

Git mounts work with profile includes. If Profile A includes Profile B:

- Both profiles' git mounts are merged
- Same repository + target path combinations override (later profile wins)
- Different combinations are kept

Example:
```
Base Profile:
  - repo: dotfiles, target: /home/user, branch: main

Development Profile (includes Base):
  - repo: dotfiles, target: /home/user, branch: develop
  - repo: dev-tools, target: /opt/tools

Resolved Result:
  - repo: dotfiles, target: /home/user, branch: develop  (overridden)
  - repo: dev-tools, target: /opt/tools                   (added)
```

## Error Handling

Git mounts are non-blocking:

- **Repository not found**: Mount is skipped, instance continues starting
- **Clone fails**: Mount is skipped, warning logged
- **Branch doesn't exist**: Falls back to current branch, warning logged
- **Glob pattern matches nothing**: Mount is skipped, warning logged
- **Path outside repository**: Match is skipped, warning logged

You can check the instance logs to see which mounts succeeded and which failed.

## Best Practices

1. **Use specific paths**: Instead of mounting the entire repository, mount only the files you need. This reduces startup time and avoids conflicts.

2. **Pin branches**: For reproducible environments, pin specific branches or tags rather than using the default branch.

3. **Keep repositories small**: Large repositories take longer to clone. Consider splitting config repositories from code repositories.

4. **Use absolute target paths**: Always use absolute paths (starting with `/`) for target paths to ensure files end up in the expected location.

5. **Test includes**: When using profile includes, use the Preview feature to verify that git mounts are merged as expected.

## Troubleshooting

**Issue**: Git mount not appearing in container
**Solution**: Check instance logs for warnings. Common causes: repository not found, clone failure, or source path not matching any files.

**Issue**: Wrong branch mounted
**Solution**: Verify branch name is correct. If branch doesn't exist locally, the system falls back to the current branch. Ensure the remote has the branch.

**Issue**: Too many files matched
**Solution**: Use more specific glob patterns. The system limits matches to 100 files per glob pattern.

**Issue**: Permission denied
**Solution**: Ensure the target path inside the container is writable. Some paths like `/usr` or `/etc` may require root access.
