DevOps & Shipping v1.0.0 MIT
Repo Backup
Use when backing up a git repository before risky work. Makes tarballs with checksums, runs a secret scan, pushes to a private backup remote and verifies each ref.
Features
- A full tarball of each working tree, including its `.git` directory.
- One checksum file beside the tarballs.
- A secret scan with triage rules by path and by key type.
- A private backup remote under its own name, so the origin is not touched.
- Per-ref verification that compares maps, not raw text.
- A report with a fixed field list.
Benefits
- Uncommitted files and local-only branches survive a bad operation.
- A backup is proven, not assumed.
- Secret findings are reported without exposing any value.
Install
From the tap (or GitHub path)
hermes skills install shagghiesuperstar/hermes-skills/skills/repo-backup --category devops
Direct URL
hermes skills install https://raw.githubusercontent.com/shagghiesuperstar/hermes-skills/main/skills/repo-backup/SKILL.md --category devops
Get the skill
Related skills
- Fleet InfrastructureIncident ForensicsUse when a process quit, died, or restarted on its own. The cause must be found from evidence. Covers timelines, ranked elimination, probe hygiene, and an honest report.
- DevOps & ShippingRepository Sanitization and PublishingUse when publishing code or docs publicly on GitHub. It must carry no personal identifiers, machine identity, network details or secrets. Covers maintaining that public repository afterwards.
- DevOps & ShippingRepo Single-Authority HygieneUse when repo docs or remote git state mislead agents. Keeps one current-truth document accurate and reconciles remote state with local history.
Related repos
The skill file
Repo Backup
Overview
A zero-data-loss snapshot of a repository and its worktrees, taken before anything riskier touches them. The pipeline writes full tarballs with checksums, scans for secrets, pushes every branch and tag to a private remote, verifies each ref, and reports in a fixed key-value shape. Uncommitted work is the part most at risk, so the tarball is the primary copy, not the remote.
When to Use
- Before long-running work that leaves uncommitted changes in a repository or worktree with no remote.
- Before a delete, rotate or wipe operation on a local directory that holds the only copy of some work.
- When a brief asks for a backup with checksums, a secret scan and verified evidence.
- For a freeze across many checkouts, run this once per repository and combine the results.
Features
- A full tarball of each working tree, including its
.gitdirectory. - One checksum file beside the tarballs.
- A secret scan with triage rules by path and by key type.
- A private backup remote under its own name, so the origin is not touched.
- Per-ref verification that compares maps, not raw text.
- A report with a fixed field list.
Benefits
- Uncommitted files and local-only branches survive a bad operation.
- A backup is proven, not assumed.
- Secret findings are reported without exposing any value.
Procedure
- Inventory with counts. For each tree, record the HEAD SHA, the branch, the number of uncommitted files (
git status --porcelain | wc -l), and any dependency versions the brief asks for. Read versions from the lockfile or manifest, not from memory. - Write the tarballs and checksums. Create
~/Backups/<context>-<date>/. For each tree, runtar -czf <name>.tar.gz -C <parent> <name>. Do not usegit archive, because it drops uncommitted files. Then runshasum -a 256 *.tar.gz > SHA256SUMSin that directory before anything reports the backup as existing. - Back up worktrees and their parents. For a git worktree, back up the worktree directory and its parent repository. The worktree's
.gitis a pointer into the parent, which holds every object. Uncommitted worktree files exist only in the tarball, so say so in the report. - Scan for secrets. Run a secret scanner on each tree (for example
gitleaks detect --source <path> --no-git --report-path <report>). Triage by path first: build output, dependency folders and generated manifests produce generic false positives. Then triage by key type. Publishable client keys are safe by design. Live server-side keys, private keys and JWT-shaped strings are real findings. Stop, do not push, and escalate. - Create the backup repository as private. Run
gh repo create <org>/<name> --private. If it already exists, view it instead of recreating it, and confirm visibility withgh repo view <org>/<name> --json visibility. A public backup is a leak. - Push to a second remote. Add a remote with its own name (for example
github-backup), then push all branches, then all tags. Never force-push a backup. If a ref already exists, compare its SHA instead of overwriting it. - Verify each ref. Parse the local ref list and the remote ref list into maps of ref to SHA, then compare per ref. Do not diff the two raw listings line by line: their separators differ, so a clean push looks like missing rows. Proceed only when no ref is missing or mismatched.
- Report. Write the brief's fields as KEY=value lines in a result file, and reply with the same block. Name steps that other people own, such as an off-host copy or a restore test, as pending. Never fold them into done.
Pitfalls
- Never print a secret value. Report findings as a count, a file path, and the key type or prefix. Apply this to the report, the result file and chat.
- GitHub rejects ref path components that begin with a dot. When you turn checkout paths into ref names, rename those components, for example
.config/xtodot.config__x. - Very large repositories are rejected on a bulk push. Push in chunks of about 100 refs.
- Save uncommitted work without touching the user's index. Build a temporary index file, write the working tree to a throwaway commit with
git commit-tree, and push that commit under a clearly namedwip/ref. Archive untracked files separately, and exclude environment files, dependency folders and build caches. - Squash merges make merged branches look unique. Find local-only work by counting commits not reachable from any remote, after a fetch. Back up branches merged by name too, rather than trusting a patch-equivalence check.
- A broken worktree is invisible to git. When a worktree's pointer leads into a deleted repository, archive it as a tarball.
- Do not call work stale, dead or shipped without a citation. Cite the commit or pull request that proves each status. A status with no citation is unclear.
- Define the terms before proposing a delete. A branch is a working copy. Merged means the change is in the main branch. Shipped means the change is in the deployed build, which you check by ancestry against the deployed commit.
- A pull request whose base branch was merged is not automatically obsolete. Measure whether its files match the main branch before proposing that it be closed.
Verification
shasum -a 256 -c SHA256SUMSpasses in the backup directory.- A secret scan report exists for each tree, and no unresolved live-key finding remains.
- The backup repository reports private visibility.
- The ref comparison reports zero missing and zero mismatched refs.
- The result block lists the HEAD SHA, the uncommitted-file count and the push status for each repository.