How to remove a Github Environment

GithubHerokuHeroku Pipelines

Github Problem Overview

My question is about cleaning up the "Environments" tab on a Github repository.

I previously deployed via Heroku, using automatic deployment from two separate Github branches (one for staging, one for production).

This created a tab "Environments" on the repository, in which both Heroku environments were shown - exactly as intended.

Once I started to dive into Heroku pipelines, I have now configured the app to be promoted to production from staging, so the production environment no longer auto-deploys from a branch.

The Environments tab on my Github repo has no way to remove the environment that I no longer use. I can't seem to find any place on Github or Heroku to make Github "forget" this deployment environment.

I hope my question is clear enough; if I can elaborate on anything, please let me know.

Github Solutions

Solution 1 - Github

There doesn't seem to be UI for it, but you can do it using the GitHub API.

You should probably disconnect GitHub and Heroku before doing this.

First, go to your GitHub account settings, then developer settings, then personal access tokens. Create a new token that has repo_deployments allowed. After it's generated, save the hexadecimal token, you'll need it for the upcoming API requests.

For these examples I'll assume that your username is $aaaa and your repo name is $bbbb and your access token is $tttt. Replace these with your actual username and repo name and access token. Or just use shell variables to store the actual values which will let you paste the code blocks directly.

First, list all the deployments on your repo:


Each deployment has an id integer. Note it, and replace $iiii in the upcoming code blocks with that ID. Or create another shell variable for it.

Now you have to create an "inactive" status for that deployment:

curl$aaaa/$bbbb/deployments/$iiii/statuses -X POST -d '{"state":"inactive"}' -H 'accept: application/vnd.github.ant-man-preview+json' -H "authorization: token $tttt"

And now you can delete the deployment forever:

curl$aaaa/$bbbb/deployments/$iiii -X DELETE -H "authorization: token $tttt"

If you have multiple deployments, send the first request to see all the deployments that remain, and then you can delete those too if you want.

After you delete all the deployments, the environments button on the GitHub repo will disappear.

Information sourced from the GitHub deployments documentation and the GitHub oauth documentation. This worked for me.

Solution 2 - Github

I made a little webpage/script too, to automate the process (I don't have Python installed, and I didn't see that someone else had already made a script), and this is online and putting your info will do the process automatically.

Stackblitz - Github Deployments deleter

Edit 18/07/2020: I copied the script from Stackblitz to a local snippet code in here too, just in case Stackblitz disappears:

// RECOMMENDED: Disconnect HEROKU from Github before doing this (though not strictly necessary, I think).
//See for more info.

const TOKEN = ""; // MUST BE `repo_deployments` authorized
const REPO = "your-repo"; // e.g. "monorepo"
const USER_OR_ORG = "your-name"; // e.g. "your-name"

const URL = `${USER_OR_ORG}/${REPO}/deployments`;
const AUTH_HEADER = `token ${TOKEN}`;

const getAllDeployments = () =>
  fetch(`${URL}`, {
    headers: {
      authorization: AUTH_HEADER
  }).then(val => val.json());

const makeDeploymentInactive = id =>
  fetch(`${URL}/${id}/statuses`, {
    method: "POST",
    body: JSON.stringify({
      state: "inactive"
    headers: {
      "Content-Type": "application/json",
      Accept: "application/vnd.github.ant-man-preview+json",
      authorization: AUTH_HEADER
  }).then(() => id);

const deleteDeployment = id =>
  fetch(`${URL}/${id}`, {
    method: "DELETE",
    headers: {
      authorization: AUTH_HEADER
  }).then(() => id);

  .then(res => {
    console.log(`${res.length} deployments found`);
    return res;
  .then(val =>{
  }) => id))
  .then(ids => Promise.all( => makeDeploymentInactive(id))))
  .then(res => {
    console.log(`${res.length} deployments marked as "inactive"`);
    return res;
  .then(ids => Promise.all( => deleteDeployment(id))))
  .then(res => {
    console.log(`${res.length} deployments deleted`);
    return res;
  .then(finalResult => {
    const appDiv = document.getElementById("app");
    appDiv.innerHTML = `
Removed Deployments: ${finalResult.length}
  <p>(Open up the console)</p>

h2 {
  font-family: Lato;

<div id="app">
  <h1>Github Deployment's Cleaner</h1>
  <p> You need to put the parameters in!</p>

Solution 3 - Github

> This will not answer the OP question, I thought it would at first, but it didn't behave as I had expected. Therefore, I'm adding this answer as a community wiki.

GitHub seems to have two notions of "Environments", the one the OP means are "public environments", but GitHub also seems to have some kind of "private environments".

I'm adding my experience as an answer below because it is really confusing.

You can access "private environments" through "Settings > Environments". (E.g:

enter image description here

You can then delete each environment. It'll prompt a confirm dialog. Upon confirm, the environment will be destroyed.

enter image description here

I deleted the "staging" and "production" environments.

enter image description here

But the public environments still continue to exist, alongside all their deployments. (and this is not what the OP wants)

Public environments still contains "staging" and "production".

Solution 4 - Github

I've made an interactive python script which can delete specific environments by name (which was my issue) or all of your deployments. Check it out and let me know if it works for you:

This will also actually delete all of your deployments even if you have more than 30 unlike the other scripts here because it goes through the paginated response data from Github's API and doesn't just use the first page.

Solution 5 - Github

Based on @Cadence's answer, I built the following bash script. Just set the appropriate parameters and let it run.

The token requires repo_deployment OAuth scope.


for id in $(curl -u $user:$token$user/$repo/deployments\?environment\=$env | jq ".[].id"); do
    curl -X POST -u $user:$token -d '{"state":"inactive"}' -H 'accept: application/vnd.github.ant-man-preview+json'$user/$repo/deployments/$id/statuses
    curl -X DELETE -u $user:$token$user/$repo/deployments/$id

Solution 6 - Github

I've built an online tool to help out removing deployments

I ran into the same problem and found @spersico's code very handy, but needed a bit more tooling/feedback. I iterated on @spersico code to add a bit of frontend. Same as @spersico's version, all calls are made client side (and are visible in your console/network logs).

Project is opensource on Github and has a hosted version on Netlify which can be used instantly:

Solution 7 - Github

Unfortunately, it seems that the 'Deployments' dashboard is currently in beta, which means that they may not have a feature yet.

Read here.

Solution 8 - Github

I've just used this Python script: 5 minutes and I removed my unwanted environment:

There is a discussion in GitHub Community:

Please, vote up the feature.

Solution 9 - Github

Using @Cadence's answer, I made a quick & dirty python3 script to automate the process. Just run it and enter your information, and all deployments will be removed, deleting the "Deployments" tab from your repo.

See this gist:

Solution 10 - Github

I don't know if this was posted already but I definitely didn't want do delete my 40+ deployments manually so I created following script, feel free to use it too :)


REPO=<your GH name>/<your project name>
TOKEN=<your personal access token>

for deployment in $(curl$REPO/deployments | jq -r '.[] | @base64'); do
    DEPLOYMENT_ID=$(echo "$deployment" | base64 --decode | jq -r '.id')
    echo "$DEPLOYMENT_ID"
    curl "$REPO/deployments/$DEPLOYMENT_ID/statuses" \
        -X POST \
        -d '{"state":"inactive"}' \
        -H 'accept: application/vnd.github.ant-man-preview+json' \
        -H "authorization: token $TOKEN"
for deployment in $(curl$REPO/deployments | jq -r '.[] | @base64'); do
    DEPLOYMENT_ID=$(echo "$deployment" | base64 --decode | jq -r '.id')
    curl "$REPO/deployments/$DEPLOYMENT_ID" \
        -X DELETE \
        -H "authorization: token $TOKEN"

Solution 11 - Github

Using GitHub CLI:


gh api "repos/${org}/${repo}/deployments?environment=${env}" \
  | jq -r .[].id \
  | xargs -n 1 -I % sh -c "
  gh api -X POST -F state=inactive repos/${org}/${repo}/deployments/%/statuses
  gh api -X DELETE repos/${org}/${repo}/deployments/%

Solution 12 - Github

You can remove the environment from a repository if its public. But in case of private repositories, either you have to make it public or use the github API. Both works, but here is my approach for deleting the environments.

I created an npm package (here) for the same. Just get the github access token, with repo_deployments scope enabled.

Now run npx delete-github-environment and select the environment that you want to delete. If everything went right, your environment will be deleted.

PS: Here's my github repo - (github), feel free to contribute to the code.

Solution 13 - Github

To remove a Github Environment go to Settings -> Environments -> and click the trashcan icon next to the Environment you want to delete (see picture below).

More can be read about it from the Github official documentation: Deleting an Environment

GitHub Environments

Solution 14 - Github

I Expect Your already got the answer for your question This answer is for those who wan't to Remove The Environments Tab from There GitHib Repo

As I Understand

Remove Environments Tab
To Remove Entire Tab
  1. On Your Repo Page Click on Settings Button"></li><li> Uncheck the Mark on Environments"></li></ol>

    It Will Remove The Environments Tab from the Right Side

    Remove Specific Environments
    For Removing Specific Environment
    1. Click on Settings"></li><li>Click On Environments"><img src=""></a></li><li>Here You Can Remove a Specific Environment"></li></ol>


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmathiscodeView Question on Stackoverflow
Solution 1 - GithubCadenceView Answer on Stackoverflow
Solution 2 - GithubspersicoView Answer on Stackoverflow
Solution 3 - GithubVadorequestView Answer on Stackoverflow
Solution 4 - GithubVishal RameshView Answer on Stackoverflow
Solution 5 - GithubFabio PoloniView Answer on Stackoverflow
Solution 6 - GithubJaapView Answer on Stackoverflow
Solution 7 - GithubGoldenBoyLDNView Answer on Stackoverflow
Solution 8 - GithubAerendirView Answer on Stackoverflow
Solution 9 - Githubewen-lbhView Answer on Stackoverflow
Solution 10 - GithubManuele VaccariView Answer on Stackoverflow
Solution 11 - GithubkjagielloView Answer on Stackoverflow
Solution 12 - GithubAjinkya DeshpandeView Answer on Stackoverflow
Solution 13 - GithubDavid AsbillView Answer on Stackoverflow
Solution 14 - GithubDeekshithSHView Answer on Stackoverflow