https://github.com/knight42/kubectl-blame
Show who edited resource fields.
https://github.com/knight42/kubectl-blame
kubectl kubectl-plugin
Last synced: 5 months ago
JSON representation
Show who edited resource fields.
- Host: GitHub
- URL: https://github.com/knight42/kubectl-blame
- Owner: knight42
- License: mit
- Created: 2020-11-02T16:18:22.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2026-02-09T04:21:39.000Z (5 months ago)
- Last Synced: 2026-02-09T10:53:11.904Z (5 months ago)
- Topics: kubectl, kubectl-plugin
- Language: Go
- Homepage:
- Size: 172 KB
- Stars: 149
- Watchers: 2
- Forks: 8
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
kubectl-blame: git-like blame for kubectl
======



Annotate each line in the given resource's YAML with information from the managedFields
to show who last modified the field.
As long as the field `.metadata.manageFields` of the resource is set properly, this command
is able to display the manager of each field.
`kubectl-blame` can work in two ways:
1. **Directly from the cluster** — fetch and blame resources in one step:
```
kubectl blame deployments my-app
```
2. **From piped input** — use `kubectl get` (or any command that outputs YAML/JSON) and pipe the result:
```
kubectl get deployments -o yaml | kubectl blame
```
This also works with Kubernetes List objects (e.g., `kind: List`), so you can pipe the output of `kubectl get` which wraps multiple resources in a List.
[](https://asciinema.org/a/375008)
## Installing
| Distribution | Command / Link |
|----------------------------------------|------------------------------------------------------------------------|
| [Krew](https://krew.sigs.k8s.io/) | `kubectl krew install blame` |
| Pre-built binaries for macOS, Linux | [GitHub releases](https://github.com/knight42/kubectl-blame/releases) |
## Usage
```
# Blame pod 'foo' in default namespace
kubectl blame pods foo
# Blame deployment 'foo' and 'bar' in 'ns1' namespace
kubectl blame -n ns1 deploy foo bar
# Blame deployment 'bar' in 'ns1' namespace and hide the update time
kubectl blame -n ns1 --time none deploy bar
# Blame resources in file 'pod.yaml'(will access remote server)
kubectl blame -f pod.yaml
# Blame deployment saved in local file 'deployment.yaml'(will NOT access remote server)
kubectl blame -i deployment.yaml
# Or pipe from stdin (auto-detected)
cat deployment.yaml | kubectl blame
```
### Flags
| flag | default | description |
|--------------------|------------|--------------------------------------------------------------------------|
| `--time` | `relative` | Time format. One of: `full`, `relative`, `none`. |
| `--color` | `auto` | Color output. One of: `auto`, `always`, `never`. |
| `--filename`, `-f` | | Filename identifying the resource to get from a server. |
| `--input`, `-i` | `auto` | Read object from the given file. When set to `auto`, automatically read from stdin if piped. Use `-` to force reading from stdin. |