GitHub: Create a tree
GitHub git.gitCreateTree: arguments, response, policy and SDK examples.
← Git operations · Get started
Operation github.git_create_tree
Provider route: POST /repos/{owner}/{repo}/git/trees. Alter supplies the connection’s credentials and routing.
Call through Alter
Section titled “Call through Alter”Install @alter-ai/sdk @alter-ai/github with npm, or alter-sdk-github with pip. Supply your connected customer’s grant ID and the arguments described below.
import { App } from "@alter-ai/sdk";import { GitHubIntegration } from "@alter-ai/github";
async function execute(input: Parameters<GitHubIntegration["git"]["gitCreateTree"]>[0]) { const app = new App({ apiKey: process.env.ALTER_API_KEY! }); try { const provider = new GitHubIntegration(app, { grantId: process.env.PROVIDER_GRANT_ID! }); const call = await provider.git.gitCreateTree(input); const result = await call.wait(); return result.bodyJson(); } finally { await app.close(); }}import osfrom alter_sdk import Appfrom alter_sdk_github import GitHubIntegration
async def execute(arguments): async with App(api_key=os.environ["ALTER_API_KEY"]) as app: provider = GitHubIntegration(app, {"grant_id": os.environ["PROVIDER_GRANT_ID"]}) call = await provider.git.git_create_tree(arguments) result = await call.wait() return result.body_json()| Field | Type | Presence | Description and constraints |
|---|---|---|---|
$ | object | Root | Additional keys: not allowed |
path | object | Required within parent | Additional keys: not allowed |
path.owner | string | Required within parent | |
path.repo | string | Required within parent | |
body | object | Required within parent | |
body.base_tree | string | Optional | The SHA1 of an existing Git tree object which will be used as the base for the new tree. If provided, a new Git tree object will be created from entries in the Git tree object pointed to by `base_tree` and entries defined in the `tree` parameter. Entries defined in the `tree` parameter will overwrite items from `base_tree` with the same `path`. If you’re creating new changes on a branch, then normally you’d set `base_tree` to the SHA1 of the Git tree object of the current latest commit on the branch you’re working on. If not provided, GitHub will create a new Git tree object from only the entries defined in the `tree` parameter. If you create a new commit pointing to such a tree, then all files which were a part of the parent commit’s tree and were not defined in the `tree` parameter will be listed as deleted by the new commit. |
body.tree | array | Required within parent | Objects (of `path`, `mode`, `type`, and `sha`) specifying a tree structure. |
body.tree[] | object | Each item | |
body.tree[].content | string | Optional | The content you want this file to have. GitHub will write this blob out and use that SHA for this entry. Use either this, or `tree.sha`. Note: Use either `tree.sha` or `content` to specify the contents of the entry. Using both `tree.sha` and `content` will return an error. |
body.tree[].mode | string | Optional | The file mode; one of `100644` for file (blob), `100755` for executable (blob), `040000` for subdirectory (tree), `160000` for submodule (commit), or `120000` for a blob that specifies the path of a symlink. One of: 100644, 100755, 040000, 160000, 120000 |
body.tree[].path | string | Optional | The file referenced in the tree. |
body.tree[].sha | JSON | Optional | |
body.tree[].sha (anyOf 1) | string | Alternative | The SHA1 checksum ID of the object in the tree. Also called `tree.sha`. If the value is `null` then the file will be deleted. Note: Use either `tree.sha` or `content` to specify the contents of the entry. Using both `tree.sha` and `content` will return an error. |
body.tree[].sha (anyOf 2) | null | Alternative | |
body.tree[].type | string | Optional | Either `blob`, `tree`, or `commit`. One of: blob, tree, commit |
Response
Section titled “Response”Response media type: application/json. The table describes the pinned successful response. Referenced models link to their complete fields.
| Field | Type | Presence | Description and constraints |
|---|---|---|---|
$ | Model | Root | Expand Get a tree — response body |
Referenced models: Get a tree — response body
Schemas
Section titled “Schemas”Get a tree — response body
| Field | Type | Presence | Description and constraints |
|---|---|---|---|
$ | object | Root | The hierarchy between files in a Git repository. |
sha | string | Required within parent | |
tree | array | Required within parent | Objects specifying a tree structure |
tree[] | object | Each item | |
tree[].mode | string | Required within parent | |
tree[].path | string | Required within parent | |
tree[].sha | string | Required within parent | |
tree[].size | JSON | Optional | |
tree[].size (anyOf 1) | integer | Alternative | |
tree[].size (anyOf 2) | string | Alternative | Pattern: ^-?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?$ |
tree[].type | string | Required within parent | |
tree[].url | string | Optional | |
truncated | boolean | Required within parent | |
url | string | Optional | Format: uri |
Policy, approvals and errors
Section titled “Policy, approvals and errors”SDK function policy ID: github.git_create_tree. Catalog operation: git/create-tree. Rules can name either ID; function rules distinguish managed calls and conservatively cover raw calls sharing the route. Existing grant permissions and policy rules apply. wait() returns an immediate result or waits for a required approval; it never approves the request itself. Persist the approval ID to resume after a restart.
Provider errors retain their response; JSON decoding raises ProviderAPIError for provider failures. ManagedOperationError identifies contract/input/retention errors. See error handling and provider-specific behavior. Sensitive input may be refused before approval storage. A decoding error never resubmits a write.
Pinned headers: {"X-GitHub-Api-Version": "2026-03-10", "User-Agent": "Alter", "Accept": "application/vnd.github+json"}