├── .gitignore ├── .npmignore ├── .nvmrc ├── README.md ├── bin └── git-removed-branches ├── index.js ├── lib ├── find-stale.js └── utils.js ├── package-lock.json ├── package.json ├── test.js ├── usage.cast └── usage.gif /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test.js 2 | usage.gif 3 | usage.cast 4 | .nvmrc 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v16.19.0 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | List or remove local tracked branches, which are deleted from the remote. 2 | 3 | 4 | Addresses questions, like: 5 | 6 | * [Remove tracking branches no longer on remote](https://stackoverflow.com/questions/7726949/remove-tracking-branches-no-longer-on-remote) 7 | * [How to prune local tracking branches that do not exist on remote anymore?](https://stackoverflow.com/questions/13064613/how-to-prune-local-tracking-branches-that-do-not-exist-on-remote-anymore/30494276#30494276) 8 | 9 | ![](https://github.com/nemisj/git-removed-branches/blob/master/usage.gif) 10 | 11 | ## Why? 12 | 13 | Because I'm tired of doing every time `git fetch -p`, `git branch -r`, `git branch` and keep comparing which branches are gone from the GitHub, but still available locally and doing `git branch -D ${branch_name}` on one by one of them. 14 | 15 | ## What does it do? 16 | 17 | This command will compare your local branches with remote and show you branches that are no longer available on remote but are still presented in your local repository. You can use it to view and delete all (remotely) removed branches in one go using `--prune` flag. 18 | 19 | This command works without the need to run `git fetch -p`, but a working network connection to your remote is required. If no connection can be established with the remote repository, then local information about your remote will be used instead. If your local repository is not in sync with the remote repository, it will warn you about it. 20 | 21 | 22 | ## Installation 23 | 24 | ### NPM 25 | 26 | ```bash 27 | $ npm install -g git-removed-branches 28 | ``` 29 | 30 | Please install a package globally with -g flag so that you can use it directly as a sub command of git, like this: 31 | 32 | ```bash 33 | $ git removed-branches 34 | ``` 35 | 36 | ### NPX 37 | 38 | It's also possible to use package through npx directly. Execute inside any git folder: 39 | 40 | ```bash 41 | $ npx git-removed-branches 42 | ``` 43 | 44 | ## Usage 45 | 46 | ```bash 47 | $ git removed-branches 48 | ``` 49 | 50 | This command will look through the branches that are no longer available on the remote and display them. 51 | In case you haven't run `git fetch -p`, it will warn you to do so. 52 | 53 | This command is safe to run and it will not alter your repository. 54 | 55 | 56 | ### Removing 57 | 58 | To delete local branches use `--prune` or `-p` flag 59 | 60 | ```bash 61 | $ git removed-branches --prune 62 | ``` 63 | 64 | This command will compare your local branches to the remote ones and remove, those which do not exist anymore on the remote side. 65 | 66 | ### Different remote 67 | 68 | If you have configured remote alias to something different than **'origin'**, you can use `--remote` or `-r` flag to specify the name of the remote. e.g., to specify remote to be `upstream`, you can use: 69 | 70 | ```bash 71 | $ git removed-branches --remote upstream 72 | ``` 73 | 74 | ## Forcing removal 75 | 76 | If you get an error when trying to delete branches: 77 | 78 | ```bash 79 | The branch {branch_name} is not fully merged. 80 | ``` 81 | 82 | you can force deletion by using `--force` flag or use `-f` alias 83 | 84 | ```bash 85 | $ git removed-branches --prune --force 86 | ``` 87 | 88 | ## Version 89 | 90 | To find out, which version you use ( since 2.3.0 ) 91 | 92 | ``` 93 | git removed-branches --version 94 | ``` 95 | 96 | ## Troubleshooting: 97 | 98 | 99 | If you encounter error `ERR_CHILD_PROCESS_STDIO_MAXBUFFER` it is possible that your repository contains too much branches, more then 3382. ( see [discussion](https://github.com/nemisj/git-removed-branches/issues/11) ) 100 | 101 | You can fix this, by specifying NODE_MAX_BUFFER environment variable, like: 102 | 103 | ``` 104 | NODE_MAX_BUFFER=1048576 git removed-branches 105 | ``` 106 | -------------------------------------------------------------------------------- /bin/git-removed-branches: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('../'); 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const FindStale = require('./lib/find-stale.js'); 2 | const utils = require('./lib/utils.js'); 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | 6 | let version = '0.0.0'; 7 | try { 8 | const packageContent = fs.readFileSync(path.join(__dirname, 'package.json')) 9 | const info = JSON.parse(packageContent) 10 | version = info.version 11 | } catch (e) { 12 | // do not care 13 | } 14 | 15 | const argv = require('minimist')(process.argv, { 16 | string: 'remote', 17 | boolean: ['prune', 'force', 'version'], 18 | alias: {p: "prune", f: "force", r: "remote"}, 19 | 'default': { 20 | 'remote': 'origin', 21 | 'force': false 22 | } 23 | }); 24 | 25 | const options = ['version', 'prune', 'p', 'force', 'f', 'remote', 'r', '_']; 26 | const hasInvalidParams = Object.keys(argv).some(name => options.indexOf(name) == -1); 27 | 28 | (async () => { 29 | if (hasInvalidParams) { 30 | console.info('Usage: git removed-branches [-p|--prune] [-f|--force] [-r|--remote ] [--version]'); 31 | return 32 | } 33 | 34 | if (argv.version) { 35 | console.log(version); 36 | process.exit(0); 37 | } 38 | 39 | const obj = new FindStale({ 40 | remove: argv.prune, 41 | force: argv.force, 42 | remote: argv.remote 43 | }); 44 | // check for git repository 45 | try { 46 | await utils.exec(['git', 'rev-parse', '--show-toplevel']); 47 | await obj.run(); 48 | } catch (err) { 49 | if (err.code === 128) { 50 | process.stderr.write('ERROR: Not a git repository\r\n'); 51 | } else if (err.code === 1984) { 52 | process.stderr.write(`ERROR: ${err.message} \r\n`); 53 | } else { 54 | process.stderr.write(err.stack + '\r\n'); 55 | } 56 | process.exit(1); 57 | } 58 | })(); 59 | -------------------------------------------------------------------------------- /lib/find-stale.js: -------------------------------------------------------------------------------- 1 | const utils = require('./utils.js'); 2 | 3 | module.exports = function (ops) { 4 | this.remote = ops.remote; 5 | 6 | this.force = !!ops.force; 7 | this.remove = !!ops.remove; 8 | } 9 | 10 | module.exports.prototype = { 11 | run: async function() { 12 | 13 | // cached branches from the remote 14 | this.remoteBranches = []; 15 | 16 | // local branches which are checkout from the remote 17 | this.localBranches = []; 18 | 19 | // branches which are available locally but not remotely 20 | this.staleBranches = []; 21 | 22 | // branches which are available on host 23 | this.liveBranches = []; 24 | 25 | // if we are unable to connect to remote 26 | // this will become true 27 | this.noConnection = false; 28 | 29 | await this.findLiveBranches(); 30 | await this.findLocalBranches() 31 | await this.findRemoteBranches(); 32 | await this.analyzeLiveAndCache(); 33 | await this.findStaleBranches(); 34 | await this.deleteBranches(); 35 | }, 36 | 37 | findLocalBranches: async function () { 38 | // list all the branches 39 | // by using format 40 | // git branch --format="%(refname:short)@{%(upstream)}" 41 | const { stdout } = await utils.exec(['git', 'branch', '--format="%(refname:short)@{%(upstream)}"']); 42 | const lines = utils.split(stdout); 43 | 44 | lines.forEach(line => { 45 | // upstream has format: "@{refs/remotes/origin/#333-work}" 46 | const startIndex = line.indexOf(`@{refs/remotes/${this.remote}`); 47 | if (startIndex === -1) { 48 | return; 49 | } 50 | 51 | const localBranch = line.slice(0, startIndex); 52 | const upstream = line.slice(startIndex + 2, -1).trim(); 53 | 54 | const upParts = upstream.match(/refs\/remotes\/[^/]+\/(.+)/); 55 | const [_, remoteBranch] = upParts; 56 | 57 | this.localBranches.push({ 58 | localBranch, 59 | remoteBranch, 60 | }); 61 | }); 62 | }, 63 | 64 | // 65 | // this method will use "git ls-remote" 66 | // to find branches which are still available on the remote 67 | // and store them in liveBranches state 68 | // 69 | findLiveBranches: async function() { 70 | if (this.remote === '') { 71 | const e = new Error('Remote is empty. Please specify remote with -r parameter'); 72 | e.code = 1984; 73 | throw e; 74 | } 75 | 76 | const { stdout: remotesStr } = await utils.exec(['git', 'remote', '-v']); 77 | 78 | const hasRemote = utils.split(remotesStr).some((line) => { 79 | const re = new RegExp(`^${this.remote}\\s`); 80 | if (re.test(line)) { 81 | return true; 82 | } 83 | }); 84 | 85 | if (!hasRemote) { 86 | console.log(`WARNING: Unable to find remote "${this.remote}".\r\n\r\nAvailable remotes are:\r\n${remotesStr}`); 87 | this.noConnection = true; 88 | return; 89 | } 90 | 91 | try { 92 | // get list of remote branches from remote host 93 | const { stdout } = await utils.exec(['git', 'ls-remote', '-h', this.remote]); 94 | const lines = utils.split(stdout); 95 | 96 | // take out sha and refs/heads 97 | lines.forEach((line) => { 98 | const group = line.match(/refs\/heads\/([^\s]*)/); 99 | if (group) { 100 | this.liveBranches.push(group[1]); 101 | } 102 | }) 103 | } catch (err) { 104 | // reset branches 105 | this.liveBranches = []; 106 | if (err.code && err.code === '128') { 107 | // error 128 means there is no connection currently to the remote 108 | // skip this step then 109 | this.noConnection = true; 110 | return; 111 | } 112 | 113 | throw err 114 | } 115 | 116 | }, 117 | 118 | findRemoteBranches: async function() { 119 | this.remoteBranches = []; 120 | 121 | // get list of remote branches 122 | const { stdout } = await utils.exec(['git', 'branch', '-r']); 123 | 124 | //split lines 125 | const branches = utils.split(stdout); 126 | 127 | // filter out non origin branches 128 | const re = new RegExp('^%s\\/([^\\s]*)'.replace('%s', this.remote)); 129 | branches.forEach((branchName) => { 130 | const group = branchName.match(re); 131 | if (group) { 132 | this.remoteBranches.push(group[1]); 133 | } 134 | }); 135 | }, 136 | 137 | // 138 | // this method will look which branches on remote are absent 139 | // but still available in here in remotes 140 | // 141 | analyzeLiveAndCache : async function () { 142 | if (this.noConnection) { 143 | // unable to determinate remote branches, because host is not available 144 | console.warn('WARNING: Unable to connect to remote host'); 145 | return; 146 | } 147 | 148 | const message = [ 149 | 'WARNING: Your git repository is outdated, please run "git fetch -p"', 150 | ' Following branches are not pruned yet locally:', 151 | '' 152 | ]; 153 | const toRemove = []; 154 | let show = false; 155 | 156 | 157 | // compare absent remotes 158 | this.remoteBranches.forEach((branch) => { 159 | if (branch === 'HEAD') { 160 | } else if (this.liveBranches.indexOf(branch) === -1) { 161 | message.push(' - ' + branch); 162 | show = true; 163 | } 164 | }); 165 | 166 | message.push(''); 167 | 168 | if (show) { 169 | console.warn(message.join('\r\n')); 170 | } 171 | 172 | this.remoteBranches = this.liveBranches; 173 | }, 174 | 175 | findStaleBranches: async function() { 176 | this.localBranches.forEach(({ localBranch, remoteBranch }) => { 177 | if (this.remoteBranches.indexOf(remoteBranch) === -1) { 178 | this.staleBranches.push(localBranch); 179 | } 180 | }); 181 | }, 182 | 183 | deleteBranches: async function() { 184 | if (!this.staleBranches.length) { 185 | console.info('No remotely removed branches found'); 186 | return; 187 | } 188 | 189 | if (!this.remove) { 190 | console.log('Found remotely removed branches:'); 191 | } 192 | 193 | const broken = []; 194 | 195 | for(const branchName of this.staleBranches) { 196 | if (this.remove) { 197 | console.info(''); 198 | console.info(`Removing "${branchName}"`); 199 | 200 | const dFlag = this.force ? '-D' : '-d'; 201 | try { 202 | const { stdout } = await utils.exec(['git', 'branch', dFlag, `"${branchName}"`]); 203 | console.info(stdout); 204 | } catch (err) { 205 | console.error(`ERROR: Unable to remove: ${err.message}`); 206 | broken.push(branchName); 207 | } 208 | } else { 209 | console.info(` - ${branchName}`); 210 | } 211 | } 212 | 213 | console.info(''); 214 | 215 | if (broken.length) { 216 | // unable to remove branch 217 | console.info('Not all branches are removed:'); 218 | broken.forEach((name) => { 219 | console.info(' - ' + name); 220 | }); 221 | console.info(''); 222 | console.info('INFO: To force removal use --force flag'); 223 | } else if (this.remove) { 224 | console.info('INFO: All branches are removed'); 225 | } else { 226 | console.info('INFO: To remove all founded branches use --prune flag'); 227 | } 228 | 229 | } 230 | } 231 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | const child_process = require('child_process'); 2 | 3 | const maxBuffer = 'NODE_MAX_BUFFER' in process.env ? Number(process.env.NODE_MAX_BUFFER): undefined; 4 | const exec = (argsArray, skipError) => { 5 | return new Promise((resolve, reject) => { 6 | child_process.exec(argsArray.join(' '), { maxBuffer }, (err, stdout, stderr) => { 7 | if (err) { 8 | if (skipError) { 9 | return resolve({ stdout, stderr }); 10 | } 11 | 12 | return reject(err); 13 | } 14 | 15 | return resolve({ stdout, stderr }); 16 | }); 17 | }); 18 | } 19 | 20 | const asyncExec = (argsArray, skipError) => { 21 | return function (callback) { 22 | child_process.exec(argsArray.join(' '), function (err, stdout, stderr) { 23 | if (err) { 24 | if (skipError) { 25 | return callback(null, stdout, stderr); 26 | } 27 | 28 | return callback(err); 29 | } 30 | 31 | return callback(null, stdout, stderr); 32 | }); 33 | } 34 | }; 35 | 36 | // Split the stdout output 37 | // and will take out all the empty lines 38 | const split = (stdout) => { 39 | return stdout.split('\n').map(line => line.trim()) 40 | // remove empty 41 | .filter(line => line != ''); 42 | } 43 | 44 | module.exports = { 45 | asyncExec: asyncExec, 46 | split: split, 47 | exec: exec, 48 | } 49 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-removed-branches", 3 | "version": "2.3.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "2.3.1", 9 | "license": "MIT", 10 | "dependencies": { 11 | "minimist": "^1.2.0" 12 | }, 13 | "bin": { 14 | "git-removed-branches": "bin/git-removed-branches" 15 | }, 16 | "engines": { 17 | "node": ">=7.10.1" 18 | } 19 | }, 20 | "node_modules/minimist": { 21 | "version": "1.2.7", 22 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 23 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 24 | "funding": { 25 | "url": "https://github.com/sponsors/ljharb" 26 | } 27 | } 28 | }, 29 | "dependencies": { 30 | "minimist": { 31 | "version": "1.2.7", 32 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 33 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-removed-branches", 3 | "version": "2.3.1", 4 | "engines": { 5 | "node": ">=7.10.1" 6 | }, 7 | "description": "Git: Remove local branches which are no longer available on the remote", 8 | "main": "index.js", 9 | "preferGlobal": true, 10 | "bin": { 11 | "git-removed-branches": "bin/git-removed-branches" 12 | }, 13 | "scripts": { 14 | "test": "node test.js" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/nemisj/git-removed-branches.git" 19 | }, 20 | "author": "Maks Nemisj", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/nemisj/git-removed-branches/issues" 24 | }, 25 | "homepage": "https://github.com/nemisj/git-removed-branches", 26 | "dependencies": { 27 | "minimist": "^1.2.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | const child_process = require('child_process'); 2 | const os = require('os'); 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const assert = require('assert'); 6 | 7 | const FindStale = require('./lib/find-stale.js'); 8 | 9 | const onlyPrepare = process.argv.find(one => one === '--prepare'); 10 | 11 | const bin = `${__dirname}${path.sep}index.js`; 12 | 13 | let tempdir; 14 | let bareDir; 15 | let workingDir; 16 | 17 | const setup = () => { 18 | const tmp = os.tmpdir() 19 | tempdir = fs.mkdtempSync(tmp + path.sep + 'git-removed-branches-'); 20 | bareDir = tempdir + path.sep + 'bare'; 21 | workingDir = tempdir + path.sep + 'working'; 22 | 23 | const file = `${workingDir}${path.sep}lolipop`; 24 | 25 | fs.mkdirSync(bareDir); 26 | 27 | console.log(`Using "${tempdir}" dir`); 28 | 29 | // create bare repository 30 | child_process.execSync('git init --bare --initial-branch=master', { cwd: bareDir, stderr: 'stdio'}); 31 | 32 | // clone repository 33 | child_process.execSync('git clone bare working', { cwd: tempdir }); 34 | 35 | // create initial commit 36 | fs.writeFileSync(file, 'lolipop content'); 37 | child_process.execSync('git add lolipop', { cwd: workingDir }); 38 | child_process.execSync('git commit -m "inital commit"', { cwd: workingDir }); 39 | 40 | // create new branch, which will be deleted by -d flag 41 | child_process.execSync('git branch feature/fast-forwarded', { cwd: workingDir }); 42 | // create another branch with special character 43 | child_process.execSync('git branch "#333-work"', { cwd: workingDir }); 44 | // create branch with renamed name, which is deleted on remote 45 | child_process.execSync('git branch chore/local-name-deleted', { cwd: workingDir }); 46 | // create branch with renamed name, which is NOT deleted on remote 47 | child_process.execSync('git branch chore/local-name-persistent', { cwd: workingDir }); 48 | // create new branch, which can be deleted only with -D flag 49 | child_process.execSync('git branch no-ff', { cwd: workingDir }); 50 | 51 | // checkout working branch 52 | child_process.execSync('git checkout no-ff', { cwd: workingDir }); 53 | 54 | // update file content 55 | fs.writeFileSync(file, 'lolipop content changed'); 56 | child_process.execSync('git commit -a -m "second commit"', { cwd: workingDir }); 57 | 58 | // push all the branches to the remote and update config 59 | child_process.execSync('git push origin -u master', { cwd: workingDir }); 60 | child_process.execSync('git push origin -u feature/fast-forwarded', { cwd: workingDir }); 61 | child_process.execSync('git push origin -u "#333-work"', { cwd: workingDir }); 62 | child_process.execSync('git push origin -u chore/local-name-deleted:chore/remote-name-deleted', { cwd: workingDir }); 63 | child_process.execSync('git push origin -u chore/local-name-persistent:chore/remote-name-persistent', { cwd: workingDir }); 64 | child_process.execSync('git push origin -u no-ff', { cwd: workingDir }); 65 | 66 | // remove all the branches from the remote, except for the local-name 67 | child_process.execSync('git push origin :feature/fast-forwarded', { cwd: workingDir }); 68 | child_process.execSync('git push origin :no-ff', { cwd: workingDir }); 69 | child_process.execSync('git push origin :"#333-work"', { cwd: workingDir }); 70 | child_process.execSync('git push origin :chore/remote-name-deleted', { cwd: workingDir }); 71 | 72 | // checkout master branch 73 | child_process.execSync('git checkout master', { cwd: workingDir }); 74 | }; 75 | 76 | const test_nothing = () => { 77 | const output = child_process.execFileSync('node', [bin], { 78 | cwd: workingDir, 79 | encoding: 'utf8', 80 | }); 81 | 82 | console.log(`------ test_nothing ------ 83 | ${output} 84 | -------------------`); 85 | 86 | assert.equal(output.indexOf('- chore/local-name-persistent'), -1); 87 | assert.notEqual(output.indexOf('- chore/local-name-deleted'), -1); 88 | assert.notEqual(output.indexOf('- #333-work'), -1); 89 | assert.notEqual(output.indexOf('- feature/fast-forwarded'), -1); 90 | assert.notEqual(output.indexOf('- no-ff'), -1); 91 | }; 92 | 93 | const testing_prune = () => { 94 | const output = child_process.execFileSync('node', [bin, '--prune'], { 95 | cwd: workingDir, 96 | encoding: 'utf8', 97 | }); 98 | 99 | console.log(`------ test_prune ------ 100 | ${output} 101 | -------------------`); 102 | 103 | assert.notEqual(output.indexOf('Deleted branch #333-work'), -1) 104 | assert.notEqual(output.indexOf('Deleted branch feature/fast-forwarded'), -1); 105 | assert.notEqual(output.indexOf('Not all branches are removed:'), -1); 106 | assert.notEqual(output.indexOf('- no-ff'), -1); 107 | }; 108 | 109 | const testing_force = () => { 110 | const output = child_process.execFileSync('node', [bin, '--force', '--prune'], { 111 | cwd: workingDir, 112 | encoding: 'utf8', 113 | }); 114 | 115 | console.log(`------ test_force ------ 116 | ${output} 117 | -------------------`); 118 | 119 | assert.notEqual(output.indexOf('Deleted branch no-ff'), -1); 120 | }; 121 | 122 | setup(); 123 | 124 | if (onlyPrepare) { 125 | console.log('All prepared'); 126 | } else { 127 | test_nothing(); 128 | testing_prune(); 129 | testing_force(); 130 | console.log('We are good to go!'); 131 | } 132 | -------------------------------------------------------------------------------- /usage.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 110, "height": 47, "timestamp": 1724925293, "idle_time_limit": 1.0, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} 2 | [0.031621, "o", "Restored session: Thu Aug 29 11:53:47 CEST 2024\r\n"] 3 | [0.041022, "o", "\u001b[0m\u001b[49m\u001b[39m\u001b[27m\u001b[24m\r\u001b[K\r\n\u001b[1A\u001b7\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/git-removed-branches-LfEx9O/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[?2004h"] 4 | [0.562704, "o", "\u001b[?25l"] 5 | [0.562948, "o", "\u001b8\u001b[0m\u001b[49m\u001b[39m\u001b[27m\u001b[24m\u001b[J"] 6 | [0.564604, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 7 | [0.564787, "o", "\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[39m\u001b[27m\u001b[24m\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r\u001b[0m\u001b[49m\u001b[39m\u001b[27m\u001b[24m\u001b[K"] 8 | [0.56636, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/git-removed-branches-LfEx9O/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[48C\u001b[0m\u001b[49m\u001b[39m\u001b[48D"] 9 | [0.566639, "o", "\u001b[?25h"] 10 | [0.566723, "o", "\u001b[?2004h"] 11 | [3.380706, "o", "g"] 12 | [3.527883, "o", "\bgi"] 13 | [3.642487, "o", "t"] 14 | [3.798703, "o", " "] 15 | [3.887222, "o", "b"] 16 | [4.034681, "o", "r"] 17 | [4.371622, "o", "a"] 18 | [4.443776, "o", "n"] 19 | [4.632866, "o", "c"] 20 | [4.706741, "o", "h"] 21 | [4.914795, "o", " "] 22 | [5.01948, "o", "-"] 23 | [5.607566, "o", "v"] 24 | [5.746676, "o", "v"] 25 | [6.041832, "o", "\u001b[?2004l\r\r\n"] 26 | [6.06907, "o", "\u001b[?1h\u001b=\r"] 27 | [6.069302, "o", " #333-work \u001b[m e8fad8c [\u001b[34morigin/#333-work\u001b[m: gone] inital commit\u001b[m\r\n chore/local-name-deleted \u001b[m e8fad8c [\u001b[34morigin/chore/remote-name-deleted\u001b[m: gone] inital commit\u001b[m\r\n chore/local-name-persistent\u001b[m e8fad8c [\u001b[34morigin/chore/remote-name-persistent\u001b[m] inital commit\u001b[m\r\n feature/fast-forwarded \u001b[m e8fad8c [\u001b[34morigin/feature/fast-forwarded\u001b[m: gone] inital commit\u001b[m\r\n* \u001b[32mmaster \u001b[m e8fad8c [\u001b[34morigin/master\u001b[m] inital commit\u001b[m\r\n no-ff \u001b[m d3143de [\u001b[34morigin/no-ff\u001b[m: gone] second commit\u001b[m\r\n"] 28 | [6.069812, "o", "\r\u001b[K\u001b[?1l\u001b>"] 29 | [6.07092, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 30 | [6.077851, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 31 | [6.089716, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 32 | [6.090069, "o", "\u001b[?2004h"] 33 | [6.773248, "o", "g"] 34 | [6.921939, "o", "\bgi"] 35 | [6.985875, "o", "t"] 36 | [7.11707, "o", " "] 37 | [7.258887, "o", "b"] 38 | [7.504885, "o", "r"] 39 | [7.72852, "o", "a"] 40 | [7.812413, "o", "n"] 41 | [7.984339, "o", "c"] 42 | [8.052153, "o", "h"] 43 | [8.171426, "o", " "] 44 | [8.275386, "o", "-"] 45 | [8.474559, "o", "r"] 46 | [8.860009, "o", "\u001b[?2004l\r\r\n"] 47 | [8.874644, "o", "\u001b[?1h\u001b=\r \u001b[31morigin/chore/remote-name-persistent\u001b[m\u001b[m\r\n \u001b[31morigin/master\u001b[m\u001b[m\r\n"] 48 | [8.875619, "o", "\r\u001b[K\u001b[?1l\u001b>"] 49 | [8.876358, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 50 | [8.882681, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 51 | [8.894076, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m"] 52 | [8.89409, "o", "\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 53 | [8.894521, "o", "\u001b[?2004h"] 54 | [9.820376, "o", "n"] 55 | [9.960809, "o", "\bnp"] 56 | [10.044904, "o", "x"] 57 | [10.15979, "o", " "] 58 | [10.578079, "o", "g"] 59 | [10.687557, "o", "i"] 60 | [10.906362, "o", "t"] 61 | [11.155258, "o", "-"] 62 | [11.360631, "o", "r"] 63 | [11.455058, "o", "e"] 64 | [11.552347, "o", "m"] 65 | [11.627188, "o", "o"] 66 | [11.717169, "o", "v"] 67 | [11.813382, "o", "e"] 68 | [11.856712, "o", "d"] 69 | [12.040604, "o", "-"] 70 | [12.213449, "o", "b"] 71 | [12.396511, "o", "r"] 72 | [12.511676, "o", "a"] 73 | [12.584359, "o", "n"] 74 | [12.704895, "o", "c"] 75 | [12.784079, "o", "h"] 76 | [12.83394, "o", "e"] 77 | [12.940148, "o", "s"] 78 | [13.935357, "o", "\u001b[?2004l\r\r\n"] 79 | [14.264116, "o", "Found remotely removed branches:\r\n"] 80 | [14.2642, "o", " - #333-work\r\n"] 81 | [14.264208, "o", " - chore/local-name-deleted\r\n"] 82 | [14.264226, "o", " - feature/fast-forwarded\r\n"] 83 | [14.264236, "o", " - no-ff\r\n\r\n"] 84 | [14.265105, "o", "INFO: To remove all founded branches use --prune flag\r\n"] 85 | [14.269524, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 86 | [14.274327, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 87 | [14.287327, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 88 | [14.287599, "o", "\u001b[?2004h"] 89 | [15.473676, "o", "n"] 90 | [15.673662, "o", "\bnp"] 91 | [16.180916, "o", "m"] 92 | [16.396118, "o", " "] 93 | [16.791563, "o", "i"] 94 | [16.959415, "o", " "] 95 | [17.079796, "o", "-"] 96 | [17.329048, "o", "g"] 97 | [17.553741, "o", " "] 98 | [17.679629, "o", "g"] 99 | [17.808776, "o", "i"] 100 | [17.913759, "o", "t"] 101 | [18.200468, "o", "-"] 102 | [18.46182, "o", "r"] 103 | [18.577639, "o", "e"] 104 | [18.658545, "o", "m"] 105 | [18.728698, "o", "o"] 106 | [18.827058, "o", "v"] 107 | [18.913349, "o", "e"] 108 | [18.997943, "o", "d"] 109 | [19.198522, "o", "-"] 110 | [19.363052, "o", "b"] 111 | [19.518563, "o", "r"] 112 | [19.651146, "o", "a"] 113 | [19.709448, "o", "n"] 114 | [19.834304, "o", "c"] 115 | [19.870855, "o", "h"] 116 | [19.973417, "o", "e"] 117 | [20.08865, "o", "s"] 118 | [20.439941, "o", "\u001b[?2004l\r\r\n"] 119 | [20.691476, "o", "\u001b[?25l"] 120 | [20.693468, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 121 | [20.742361, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 122 | [20.792644, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 123 | [20.844825, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 124 | [20.896548, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 125 | [20.948479, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 126 | [20.999318, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 127 | [21.050934, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 128 | [21.101637, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 129 | [21.154555, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 130 | [21.204431, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 131 | [21.255145, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠏ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 132 | [21.307144, "o", "(\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠹ idealTree:lib: \u001b[7msill\u001b[0m \u001b[35midealTree\u001b[0m buildDeps\u001b[0m\u001b[K\r"] 133 | [21.356509, "o", "(\u001b[107;97m#########\u001b[0m\u001b[100;90m⠂⠂⠂⠂⠂⠂⠂⠂⠂\u001b[0m) ⠋ idealTree: \u001b[32;40mtiming\u001b[0m \u001b[35midealTree\u001b[0m Completed in 683ms\u001b[0m\u001b[K\r"] 134 | [21.408031, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 135 | [21.458403, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 136 | [21.509881, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 137 | [21.561404, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 138 | [21.612489, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 139 | [21.662952, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 140 | [21.71462, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 141 | [21.766324, "o", "(\u001b[107;97m##################\u001b[0m) ⠏ reify:minimist: \u001b[32;40mtiming\u001b[0m \u001b[35mreifyNode:node_modules/git-removed-branches\u001b[0m Completed in 12ms\u001b[0m\u001b[K\r"] 142 | [21.791199, "o", "\r\u001b[K\u001b[?25h"] 143 | [21.793107, "o", "\r\nchanged 2 packages, and audited 3 packages in 1s\r\n"] 144 | [21.793207, "o", "\r\n"] 145 | [21.793303, "o", "1 package is looking for funding\r\n run `npm fund` for details\r\n"] 146 | [21.794558, "o", "\r\nfound \u001b[32m\u001b[1m0\u001b[22m\u001b[39m vulnerabilities\r\n"] 147 | [21.802913, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 148 | [21.814766, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 149 | [21.828228, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 150 | [21.828622, "o", "\u001b[?2004h"] 151 | [24.005645, "o", "g"] 152 | [24.101558, "o", "\bgi"] 153 | [24.17997, "o", "t"] 154 | [24.294386, "o", " "] 155 | [24.433599, "o", "r"] 156 | [24.521477, "o", "e"] 157 | [24.621215, "o", "m"] 158 | [24.696706, "o", "o"] 159 | [24.791629, "o", "v"] 160 | [24.869901, "o", "e"] 161 | [24.930457, "o", "d"] 162 | [25.135137, "o", "-"] 163 | [25.303724, "o", "b"] 164 | [25.446257, "o", "r"] 165 | [25.566896, "o", "a"] 166 | [25.631234, "o", "n"] 167 | [25.763341, "o", "c"] 168 | [25.828939, "o", "h"] 169 | [25.896332, "o", "e"] 170 | [26.044415, "o", "s"] 171 | [26.529168, "o", "\u001b[?2004l\r\r\n"] 172 | [26.886551, "o", "Found remotely removed branches:\r\n"] 173 | [26.886697, "o", " - #333-work\r\n - chore/local-name-deleted\r\n - feature/fast-forwarded\r\n - no-ff\r\n\r\n"] 174 | [26.886757, "o", "INFO: To remove all founded branches use --prune flag\r\n"] 175 | [26.888622, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 176 | [26.893385, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 177 | [26.900283, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 178 | [26.900578, "o", "\u001b[?2004h"] 179 | [29.468977, "o", "\u001b[?25l"] 180 | [29.470749, "o", "\u001b[H\u001b[2J\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 181 | [29.470908, "o", "\u001b[?25h"] 182 | [29.98471, "o", "git removed-branches"] 183 | [30.553433, "o", " "] 184 | [31.745123, "o", "-"] 185 | [31.890368, "o", "-"] 186 | [32.05142, "o", "p"] 187 | [32.221485, "o", "r"] 188 | [32.308668, "o", "u"] 189 | [32.372954, "o", "n"] 190 | [32.520691, "o", "e"] 191 | [34.497499, "o", "\u001b[?2004l\r\r\n"] 192 | [34.604696, "o", "\r\n"] 193 | [34.604847, "o", "Removing \"#333-work\"\r\n"] 194 | [34.612491, "o", "Deleted branch #333-work (was e8fad8c).\r\n\r\n"] 195 | [34.612519, "o", "\r\nRemoving \"chore/local-name-deleted\"\r\n"] 196 | [34.619595, "o", "Deleted branch chore/local-name-deleted (was e8fad8c).\r\n\r\n\r\nRemoving \"feature/fast-forwarded\"\r\n"] 197 | [34.626512, "o", "Deleted branch feature/fast-forwarded (was e8fad8c).\r\n\r\n"] 198 | [34.626626, "o", "\r\n"] 199 | [34.626679, "o", "Removing \"no-ff\"\r\n"] 200 | [34.632967, "o", "ERROR: Unable to remove: Command failed: git branch -d \"no-ff\"\r\nerror: The branch 'no-ff' is not fully merged.\r\nIf you are sure you want to delete it, run 'git branch -D no-ff'.\r\n\r\n\r\n"] 201 | [34.632985, "o", "Not all branches are removed:\r\n"] 202 | [34.633097, "o", " - no-ff\r\n"] 203 | [34.633152, "o", "\r\nINFO: To force removal use --force flag\r\n"] 204 | [34.635033, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 205 | [34.6396, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 206 | [34.647674, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 207 | [34.647973, "o", "\u001b[?2004h"] 208 | [36.838442, "o", "g"] 209 | [36.896814, "o", "\bgi"] 210 | [37.274254, "o", "t"] 211 | [37.404366, "o", " "] 212 | [37.48023, "o", "b"] 213 | [37.615248, "o", "r"] 214 | [37.775723, "o", "a"] 215 | [37.857202, "o", "n"] 216 | [38.040395, "o", "c"] 217 | [38.10337, "o", "h"] 218 | [38.553738, "o", " "] 219 | [38.645488, "o", "-"] 220 | [38.817715, "o", "v"] 221 | [38.945217, "o", "v"] 222 | [39.264695, "o", "\u001b[?2004l\r\r\n"] 223 | [39.27735, "o", "\u001b[?1h\u001b=\r chore/local-name-persistent\u001b[m e8fad8c [\u001b[34morigin/chore/remote-name-persistent\u001b[m] inital commit\u001b[m\r\n* \u001b[32mmaster \u001b[m e8fad8c [\u001b[34morigin/master\u001b[m] inital commit\u001b[m\r\n no-ff \u001b[m d3143de [\u001b[34morigin/no-ff\u001b[m: gone] second commit\u001b[m\r\n"] 224 | [39.277717, "o", "\r\u001b[K\u001b[?1l\u001b>"] 225 | [39.278335, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 226 | [39.283834, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 227 | [39.292037, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 228 | [39.292463, "o", "\u001b[?2004h"] 229 | [42.123489, "o", "g"] 230 | [42.282942, "o", "\bgi"] 231 | [43.04232, "o", "t"] 232 | [43.145349, "o", " "] 233 | [43.239285, "o", "r"] 234 | [43.347545, "o", "e"] 235 | [43.446828, "o", "m"] 236 | [43.543462, "o", "o"] 237 | [43.607203, "o", "v"] 238 | [43.726668, "o", "e"] 239 | [43.811435, "o", "d"] 240 | [44.30701, "o", "-"] 241 | [44.480123, "o", "b"] 242 | [44.620711, "o", "r"] 243 | [44.775366, "o", "a"] 244 | [44.843207, "o", "n"] 245 | [45.005624, "o", "c"] 246 | [45.074904, "o", "h"] 247 | [45.116786, "o", "e"] 248 | [45.247155, "o", "s"] 249 | [45.382612, "o", " "] 250 | [45.540114, "o", "-"] 251 | [45.65971, "o", "-"] 252 | [45.783131, "o", "p"] 253 | [45.906795, "o", "r"] 254 | [45.994091, "o", "u"] 255 | [46.062589, "o", "n"] 256 | [46.170094, "o", "e"] 257 | [46.319942, "o", " "] 258 | [46.493556, "o", "-"] 259 | [46.632276, "o", "-"] 260 | [46.786687, "o", "f"] 261 | [46.90832, "o", "o"] 262 | [46.952944, "o", "r"] 263 | [47.032417, "o", "c"] 264 | [47.125068, "o", "e"] 265 | [47.722682, "o", "\u001b[?2004l\r\r\n"] 266 | [47.83161, "o", "\r\n"] 267 | [47.831748, "o", "Removing \"no-ff\"\r\n"] 268 | [47.839093, "o", "Deleted branch no-ff (was d3143de).\r\n\r\n\r\n"] 269 | [47.839116, "o", "INFO: All branches are removed\r\n"] 270 | [47.840879, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 271 | [47.84566, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 272 | [47.853736, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 273 | [47.854028, "o", "\u001b[?2004h"] 274 | [49.6317, "o", "git removed-branches --prune --force"] 275 | [49.821009, "o", "\u001b[32Dbranch -vv \u001b[22D"] 276 | [50.815588, "o", "\u001b[?2004l\r\r\n"] 277 | [50.841859, "o", "\u001b[?1h\u001b=\r chore/local-name-persistent\u001b[m e8fad8c [\u001b[34morigin/chore/remote-name-persistent\u001b[m] inital commit\u001b[m\r\n* \u001b[32mmaster \u001b[m e8fad8c [\u001b[34morigin/master\u001b[m] inital commit\u001b[m\r\n"] 278 | [50.84257, "o", "\r\u001b[K\u001b[?1l\u001b>"] 279 | [50.843642, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 280 | [50.853393, "o", "\u001b]7;file://Makss-MacBook-Pro.local/var/folders/qy/ljk6mnqn5wv2k285cc53zrxw0000gn/T/git-removed-branches-LfEx9O/working\u0007"] 281 | [50.863747, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[0m\u001b[49m\u001b[39m\u001b[0m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mvar\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mf\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103mq\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[38;5;103ml\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/T/\u001b[38;5;103mgit-removed-branches-L\u001b[0m\u001b[38;5;103m\u001b[49m\u001b[38;5;31m/\u001b[1m\u001b[38;5;31m\u001b[38;5;39mworking\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;31m\u001b[0m\u001b[38;5;31m\u001b[49m \u001b[0m\u001b[38;5;31m\u001b[49m\u001b[38;5;76m\u001b[38;5;76mmaster \u001b[38;5;39m?1\u001b[0m\u001b[38;5;39m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m \u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m❯\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[38;5;76m\u001b[0m\u001b[38;5;76m\u001b[49m\u001b[30m\u001b[0m\u001b[30m\u001b[49m\u001b[39m \u001b[0m\u001b[49m\u001b[39m\u001b[K\u001b[53C\u001b[0m\u001b[49m\u001b[39m\u001b[53D"] 282 | [50.864182, "o", "\u001b[?2004h"] 283 | [53.254851, "o", "\u001b[?2004l\r\r\n"] 284 | [53.256345, "o", "\r\nSaving session..."] 285 | [53.262161, "o", "\r\n...saving history..."] 286 | [53.267618, "o", "truncating history files..."] 287 | [53.270644, "o", "\r\n..."] 288 | [53.270732, "o", "completed.\r\n"] 289 | -------------------------------------------------------------------------------- /usage.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nemisj/git-removed-branches/3508153bcdb5e2e5e490e0168519f5c850b537f2/usage.gif --------------------------------------------------------------------------------