Git integration
Clone repositories, manage branches, and push changes using the sandbox.git methods.
Use the sandbox.git methods to run common git operations inside a sandbox.
Authentication and Identity
Passing credentials inline
For private repositories over HTTP(S), pass username and password (token) directly to commands that need authentication. A username is required whenever you pass a password/token.
const repoPath = '/home/user/repo'
await sandbox.git.push(repoPath, {
username: process.env.GIT_USERNAME,
password: process.env.GIT_TOKEN,
})
await sandbox.git.pull(repoPath, {
username: process.env.GIT_USERNAME,
password: process.env.GIT_TOKEN,
})Credential helper (authenticate once)
To avoid passing credentials on each command, store them in the git credential helper inside the sandbox using dangerouslyAuthenticate() / dangerously_authenticate().
Stores credentials on disk inside the sandbox. Any process or agent with access to the sandbox can read them. Use only when you understand the risk.
// Default (GitHub)
await sandbox.git.dangerouslyAuthenticate({
username: process.env.GIT_USERNAME,
password: process.env.GIT_TOKEN,
})
// Custom host (self-hosted)
await sandbox.git.dangerouslyAuthenticate({
username: process.env.GIT_USERNAME,
password: process.env.GIT_TOKEN,
host: 'git.example.com',
protocol: 'https',
})
// After this, HTTPS git operations use the stored credentials
await sandbox.git.clone('https://git.example.com/org/repo.git', { path: '/home/user/repo' })
await sandbox.git.push('/home/user/repo')Keep credentials in the remote URL
By default, credentials are stripped from the remote URL after cloning. To keep credentials in the remote URL (stored in .git/config), set dangerouslyStoreCredentials / dangerously_store_credentials.
Storing credentials in the remote URL persists them in the repo config. Any process or agent with access to the sandbox can read them. Only use this when required.
// Default: credentials are stripped from the remote URL
await sandbox.git.clone('https://git.example.com/org/repo.git', {
path: '/home/user/repo',
username: process.env.GIT_USERNAME,
password: process.env.GIT_TOKEN,
})
// Keep credentials in the remote URL
await sandbox.git.clone('https://git.example.com/org/repo.git', {
path: '/home/user/repo',
username: process.env.GIT_USERNAME,
password: process.env.GIT_TOKEN,
dangerouslyStoreCredentials: true,
})Configure git identity
Set the git author name and email for commits. Configure globally or per-repository.
const repoPath = '/home/user/repo'
// Global config
await sandbox.git.configureUser('E2B Bot', 'bot@example.com')
// Repo-local config
await sandbox.git.configureUser('E2B Bot', 'bot@example.com', {
scope: 'local',
path: repoPath
})Clone a repository
See Authentication and Identity for how to authenticate with private repositories.
const repoUrl = 'https://git.example.com/org/repo.git'
const repoPath = '/home/user/repo'
// Default clone
await sandbox.git.clone(repoUrl, { path: repoPath })
// Clone a specific branch
await sandbox.git.clone(repoUrl, { path: repoPath, branch: 'main' })
// Shallow clone
await sandbox.git.clone(repoUrl, { path: repoPath, depth: 1 })Check status and branches
status() returns a structured object with branch, ahead/behind, and file status details. branches() returns the branch list and the current branch.
const repoPath = '/home/user/repo'
const status = await sandbox.git.status(repoPath)
console.log(status.currentBranch, status.ahead, status.behind)
console.log(status.fileStatus)
const branches = await sandbox.git.branches(repoPath)
console.log(branches.currentBranch)
console.log(branches.branches)Create and manage branches
const repoPath = '/home/user/repo'
// Create and switch to a new branch
await sandbox.git.createBranch(repoPath, 'feature/new-docs')
// Check out an existing branch
await sandbox.git.checkoutBranch(repoPath, 'main')
// Delete a branch
await sandbox.git.deleteBranch(repoPath, 'feature/old-docs')
// Force delete a branch
await sandbox.git.deleteBranch(repoPath, 'feature/stale-docs', { force: true })Stage and commit
const repoPath = '/home/user/repo'
// Default: stage all changes, commit with repo config
await sandbox.git.add(repoPath)
await sandbox.git.commit(repoPath, 'Initial commit')
// Stage specific files
await sandbox.git.add(repoPath, { files: ['README.md', 'src/index.ts'] })
// Allow empty commit and override author
await sandbox.git.commit(repoPath, 'Docs sync', {
authorName: 'E2B Bot',
authorEmail: 'bot@example.com',
allowEmpty: true,
})Pull and push
See Authentication and Identity for how to authenticate with private repositories.
const repoPath = '/home/user/repo'
// Default (uses upstream when set)
await sandbox.git.push(repoPath)
await sandbox.git.pull(repoPath)
// Target a specific remote/branch and set upstream
await sandbox.git.push(repoPath, {
remote: 'origin',
branch: 'main',
setUpstream: true,
})
await sandbox.git.pull(repoPath, {
remote: 'origin',
branch: 'main',
})Manage remotes
const repoPath = '/home/user/repo'
const repoUrl = 'https://git.example.com/org/repo.git'
// Default
await sandbox.git.remoteAdd(repoPath, 'origin', repoUrl)
// Fetch after adding the remote
await sandbox.git.remoteAdd(repoPath, 'origin', repoUrl, { fetch: true })
// Overwrite the remote URL if it already exists
await sandbox.git.remoteAdd(repoPath, 'origin', repoUrl, { overwrite: true })Git config
Set and get git configuration values. See Configure git identity for configuring the commit author.
const repoPath = '/home/user/repo'
// Global config
await sandbox.git.setConfig('pull.rebase', 'false')
const rebase = await sandbox.git.getConfig('pull.rebase')
// Repo-local config
await sandbox.git.setConfig('pull.rebase', 'false', { scope: 'local', path: repoPath })
const localRebase = await sandbox.git.getConfig('pull.rebase', { scope: 'local', path: repoPath })