Description 582 -> 237 chars, body 1217 -> 290 words. The single remotes.md splits into config, fetch, push, and pull flow files. Restores the confirm: true token to the force-push gate -- it is the git plugin's cross-skill contract, gated on by git-orchestrate and git-branches. Moves push.md's worked example off main, which the skill's own Step 1 refuses, and restores the never-bare---force directive.
60 lines
2.4 KiB
Markdown
60 lines
2.4 KiB
Markdown
---
|
|
name: git-remotes
|
|
|
|
description: >
|
|
Use when a git operation — remote config, fetch, push, or pull — touches a
|
|
remote, even when the user does not name it.
|
|
Not local commits -> `git-commits`.
|
|
Not local branches -> `git-branches`.
|
|
Not submodule pointers -> `git-submodules`.
|
|
|
|
metadata:
|
|
category: git-workflow
|
|
source_keys:
|
|
- git-scm-remote-docs
|
|
- git-scm-fetch-docs
|
|
- git-scm-push-docs
|
|
- git-scm-pull-docs
|
|
- context7-git-htmldocs
|
|
|
|
---
|
|
|
|
## Gotchas
|
|
|
|
- **`--force-with-lease` alone is not safe** — background processes (IDE plugins, cron jobs) running `git fetch` silently defeat the protection. Combine it with `--force-if-includes`, or pin the explicit `--force-with-lease=<ref>:<sha>` form.
|
|
- **Prune does not touch tags by default** — `git fetch --prune` leaves orphaned tags behind. Use `--prune --prune-tags`, or set `fetch.pruneTags true`.
|
|
- **Pull defaults shift between Git versions** — older ones default to merge, newer to `--ff-only`. Set `pull.ff only` explicitly rather than trusting the installed default.
|
|
|
|
## Step 1 — Clear the force-push gate
|
|
|
|
`main` and `master` are a hard refusal: decline a force-push targeting either, whatever confirmation accompanies it, because no local approval can restore what the remote loses. On any other branch, `git push --force` and `-f` run only after the caller passes `confirm: true` for that specific push — for a human caller, prompt instead of failing.
|
|
|
|
## Step 2 — Dispatch
|
|
|
|
Read the row matching the operation, and only that row — each file is self-contained. A task spanning two operations reads both.
|
|
|
|
| Operation | Read |
|
|
|---|---|
|
|
| Add, remove, rename, inspect, or re-point a remote; tracking, mirror, and `set-url` config | `references/remote-config.md` |
|
|
| Fetch or prune remote-tracking refs; shallow or partial fetch | `references/fetch.md` |
|
|
| Push branches or tags; refspecs; force-push | `references/push.md` |
|
|
| Pull — integrate remote changes into the current branch | `references/pull.md` |
|
|
|
|
## Step 3 — Return format
|
|
|
|
For agent callers, return:
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"operation": "push",
|
|
"remote": "origin",
|
|
"branch": "main",
|
|
"output": "...",
|
|
"warnings": ["force-with-lease not confirmed"],
|
|
"recommendations": ["set `pull.ff only` so the default does not vary by Git version"]
|
|
}
|
|
```
|
|
|
|
On failure, set `success: false` and add an `error` field holding the root cause and a recovery suggestion.
|