mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-16 06:43:07 -07:00
feat(core): allow reusing existing worktrees with --worktree flag
This commit is contained in:
@@ -80,8 +80,23 @@ manually remove the worktree if you no longer need it.
|
||||
|
||||
## Resuming work in a Git worktree
|
||||
|
||||
To resume a session in a worktree, navigate to the worktree directory and start
|
||||
Gemini CLI with the `--resume` flag and the session ID:
|
||||
To resume a session in an existing worktree, you can simply run Gemini with the
|
||||
same `--worktree` (`-w`) name:
|
||||
|
||||
```bash
|
||||
gemini --worktree feature-search
|
||||
```
|
||||
|
||||
Alternatively, you can navigate to the worktree directory and start Gemini
|
||||
directly:
|
||||
|
||||
```bash
|
||||
cd .gemini/worktrees/feature-search
|
||||
gemini
|
||||
```
|
||||
|
||||
To resume a specific previous chat session within that worktree, use the
|
||||
`--resume` flag and the session ID:
|
||||
|
||||
```bash
|
||||
cd .gemini/worktrees/feature-search
|
||||
|
||||
@@ -85,7 +85,8 @@ describe('worktree utilities', () => {
|
||||
});
|
||||
|
||||
describe('createWorktree', () => {
|
||||
it('should execute git worktree add with correct branch and path', async () => {
|
||||
it('should execute git worktree add with correct branch and path if it does not exist', async () => {
|
||||
vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
|
||||
vi.mocked(execa).mockResolvedValue({ stdout: '' } as never);
|
||||
|
||||
const resultPath = await createWorktree(projectRoot, worktreeName);
|
||||
@@ -98,7 +99,17 @@ describe('worktree utilities', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('should return existing path and not call git if it already exists', async () => {
|
||||
vi.mocked(fs.access).mockResolvedValue(undefined);
|
||||
|
||||
const resultPath = await createWorktree(projectRoot, worktreeName);
|
||||
|
||||
expect(resultPath).toBe(expectedPath);
|
||||
expect(execa).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should throw an error if git worktree add fails', async () => {
|
||||
vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
|
||||
vi.mocked(execa).mockRejectedValue(new Error('git failed'));
|
||||
|
||||
await expect(createWorktree(projectRoot, worktreeName)).rejects.toThrow(
|
||||
|
||||
@@ -120,6 +120,15 @@ export async function createWorktree(
|
||||
name: string,
|
||||
): Promise<string> {
|
||||
const worktreePath = getWorktreePath(projectRoot, name);
|
||||
|
||||
try {
|
||||
await fs.access(worktreePath);
|
||||
// Worktree path already exists, reuse it
|
||||
return worktreePath;
|
||||
} catch {
|
||||
// Does not exist, proceed to create
|
||||
}
|
||||
|
||||
const branchName = `worktree-${name}`;
|
||||
|
||||
await execa('git', ['worktree', 'add', worktreePath, '-b', branchName], {
|
||||
|
||||
Reference in New Issue
Block a user