| 1 | --- |
| 2 | title: Transferring a repository |
| 3 | description: Move a repository to another workspace, with its issues, pull requests, deployments and history, while its old address keeps working. |
| 4 | --- |
| 5 | |
| 6 | Transferring moves a repository from one workspace to another. It keeps its |
| 7 | name, and everything in it moves with it. Its address changes from |
| 8 | `g1t.sh/<old>/<repo>` to `g1t.sh/<new>/<repo>`, and the old address keeps |
| 9 | working as a redirect. |
| 10 | |
| 11 | To change only its name and keep it in its workspace, |
| 12 | [rename it](/guides/managing-repositories/#rename-a-repository) instead; |
| 13 | its old address redirects the same way. To be rid of a repository rather |
| 14 | than move it, [delete it](/guides/managing-repositories/#delete-a-repository). |
| 15 | |
| 16 | ## Who can transfer |
| 17 | |
| 18 | In the workspace the repository is in, you must be an **owner**, or a |
| 19 | member with the Admin role on it when the workspace's |
| 20 | [member privileges](/guides/workspaces/#member-privileges) let repository |
| 21 | admins delete and transfer repositories (off by default). In the workspace |
| 22 | it moves to, you must be an owner, or a member who may create a repository |
| 23 | of its kind there. An access token that belongs to a workspace, or g1t's |
| 24 | token, cannot transfer. Your email address must be confirmed. |
| 25 | |
| 26 | ## Transfer a repository |
| 27 | |
| 28 | 1. Open the project's **Settings → General**. |
| 29 | 2. Under **Danger zone**, choose **Transfer**. The project moves with its |
| 30 | repository. |
| 31 | 3. Pick the workspace to move it to. Only workspaces where you can create |
| 32 | a repository like it are listed. |
| 33 | 4. Read what changes, type the repository's full name (`<old>/<repo>`) to |
| 34 | confirm, and choose **Transfer**. |
| 35 | |
| 36 | You land on the repository's settings at its new address. Everything kept |
| 37 | about it elsewhere in g1t (search, deployments and the rest) follows within a few seconds. |
| 38 | |
| 39 | From the API, call |
| 40 | [`POST /repos/{owner}/{name}/transfer`](/reference/api/repositories/transfer-repo/) |
| 41 | with the destination in `to`: |
| 42 | |
| 43 | ```sh |
| 44 | curl -X POST https://api.g1t.sh/repos/acme/rocket/transfer \ |
| 45 | -H "Authorization: Bearer $G1T_TOKEN" \ |
| 46 | -H "Content-Type: application/json" \ |
| 47 | -d '{"to": "acme-labs"}' |
| 48 | ``` |
| 49 | |
| 50 | Over MCP, it is the `repository` tool's `transfer` action, with `repo` and |
| 51 | `to`. A token's owner must |
| 52 | own both workspaces, as on the site. |
| 53 | |
| 54 | ## When a transfer is refused |
| 55 | |
| 56 | | Response | Why | What to do | |
| 57 | | --- | --- | --- | |
| 58 | | `403 forbidden` | You do not own one of the two workspaces, or you are using a workspace token. | Ask an owner of both to transfer it, or use a personal token. | |
| 59 | | `409 conflict` | The destination already has a repository with that name, or a recently deleted one held it. | Rename or move that repository first, or purge the deleted one. | |
| 60 | | `402 payment_required` | The repository is private, the destination is on no plan, and its private repositories would hold more than a free workspace's 1 GB. | Start the g1t plan in the destination, or make the repository public first. | |
| 61 | | `422 invalid` | No destination, or the destination is the workspace it is already in. | Name another workspace. | |
| 62 | |
| 63 | ## What moves |
| 64 | |
| 65 | Everything that belongs to the repository moves with it: |
| 66 | |
| 67 | | | | |
| 68 | | --- | --- | |
| 69 | | Code | Every branch and tag. The git data does not move or copy; only the address changes. | |
| 70 | | Issues and pull requests | With their numbers, comments, reviews, labels, sessions and merge queue. | |
| 71 | | Workflows | Workflow runs, their jobs, logs and artifacts. | |
| 72 | | Deployments | The repository's project, its deployments and its custom domains. See [deployments](#deployments). | |
| 73 | | Its own settings | Merge rules, branch protection and guardrails. | |
| 74 | | Its own secrets and variables | Set on the repository, they move with it. | |
| 75 | | Its own webhooks | They now name the repository by its new path. | |
| 76 | |
| 77 | These belong to the old workspace and stay with it: |
| 78 | |
| 79 | | | | |
| 80 | | --- | --- | |
| 81 | | Workspace secrets and variables | The old workspace's stop reaching the repository; the new workspace's start, if they reach every repository or name this one. | |
| 82 | | Workspace webhooks | The old workspace's stop hearing about the repository; the new one's start. | |
| 83 | | Integrations | Sentry, Datadog, Jira and Linear connections stay with their workspace. Connect them in the new one if you need them there. | |
| 84 | | Workspace guardrails | The new workspace's apply from now on. | |
| 85 | | The audit log | What happened before the transfer stays in the old workspace's log. Each workspace's log records the transfer itself. | |
| 86 | | Billing history | See [billing](#billing). | |
| 87 | |
| 88 | ## Old addresses |
| 89 | |
| 90 | The old address keeps working, for as long as nothing else is made there: |
| 91 | |
| 92 | | | Behaviour | |
| 93 | | --- | --- | |
| 94 | | Web pages | A permanent redirect (`301`) to the same page at the new address, query string included. A private repository redirects only for people who can see it; anyone else gets a 404, as before. | |
| 95 | | `git clone`, `fetch` and `pull` | Redirected to the new remote. Git follows it and prints a warning each time. | |
| 96 | | `git push` | Redirected the same way: git asks for the push's refs at the old address, follows the redirect, and sends the push to the new one. | |
| 97 | | API and MCP | A call that names the repository by its old path runs against it at its new path. | |
| 98 | | `g1t.page` apps | The old app addresses redirect to the new ones for 90 days. | |
| 99 | |
| 100 | A redirect stops as soon as a repository is created at the old address, |
| 101 | whether by the site, the API or a push that creates one. Update your |
| 102 | remotes rather than relying on it: |
| 103 | |
| 104 | ```sh |
| 105 | git remote set-url origin https://g1t.sh/<new>/<repo>.git |
| 106 | ``` |
| 107 | |
| 108 | Update anything else with the old address in it too: links in READMEs, CI |
| 109 | configuration, API clients and MCP clients. |
| 110 | |
| 111 | If the old workspace is later [deleted](/guides/workspaces/#delete-a-workspace), |
| 112 | its name is never given to anyone else, so the redirects keep working. |
| 113 | |
| 114 | ## Deployments |
| 115 | |
| 116 | A `g1t.page` address ends in its workspace's name: production is at |
| 117 | `<project>-<workspace>.g1t.page`. After a transfer, each of the project's |
| 118 | apps (production and every open preview, including one paused by the old |
| 119 | workspace's usage limit) is built again from the same commit under the new |
| 120 | workspace's name. The old address keeps serving until the new one is live, |
| 121 | then redirects to it for 90 days, whatever the old workspace's plan or |
| 122 | limit. Custom domains move with the project and serve the new build. |
| 123 | |
| 124 | From the transfer on, the apps are the new workspace's: its plan and usage |
| 125 | limit decide whether they build and serve. If the new workspace cannot |
| 126 | build yet (Deployments are off, or it reached its limit), the rebuild waits |
| 127 | and is tried again until it can. |
| 128 | |
| 129 | ## Billing |
| 130 | |
| 131 | - Usage from the moment of the transfer is charged to the new workspace: |
| 132 | workflow jobs, builds, app traffic, git operations and storage. |
| 133 | - What the repository used before stays on the old workspace's bill. |
| 134 | Runs already under way finish on the bill they started on. |
| 135 | - Storage follows the repository: from the next daily count it is the new |
| 136 | workspace's private storage. |
| 137 | - A public repository's share of the open-source pool this month moves |
| 138 | with it. |