| name | cncf-migration-author-mapper |
| description | Map internal corporate author identities (name + email) to public github.com identities using MCP-driven user lookup, then rewrite git history with git-filter-repo + .mailmap. Specific to CNCF OSS migration workflows.
|
When to Use This Skill
Use this skill when:
- A repository being open-sourced has commits attributed to internal
@corp.com email addresses
- Contributors want their public github.com noreply email to appear in the OSS history
- DCO sign-off needs to be retroactively appended to historical commits
Do NOT use this skill for general git rebase or author correction tasks unrelated to migration.
Why This Matters for CNCF
CNCF CLOMonitor and OpenSSF Scorecard measure contributor diversity from commit history.
Commits showing only user@internal.corp obscure the real contributor graph and prevent
contributors from receiving proper attribution on their public GitHub profiles.
Approach A (Vionix's choice): squash to milestone commits — history is minimal, no rewrite needed.
Approach B (this skill): preserve full commit history but rewrite author metadata only.
Tools Required
pip install git-filter-repo
Step 1 — Discover Internal Authors
git log --format="%an|%ae" | sort -u
Step 2 — Resolve Public GitHub Identities
For each internal author, use the available MCP tools and gh CLI to find their
public github.com handle:
2a. Search GHES for login username
MCP tool: mcp__git_viasat_com-viasat-github__search_users
query: "<First Last>"
→ returns GHES login (e.g. jmaze, mpanjabi, dlgarcia)
2b. Look up corporate AD info via VICE
MCP tool: mcp__viasat-vice__vice_get_user_ad_info_by_email
email: "user@viasat.com"
full: true
→ confirms firstName, lastName, itAdUser
2c. Search github.com by name
gh api "search/users?q=<First+Last>&per_page=5"
2d. Check public org membership
gh api "orgs/<OrgName>/members?per_page=100" | python3 -c "
import json,sys
[print(m['login']) for m in json.load(sys.stdin)]
"
2e. Fetch public profile to confirm and get noreply email
gh api "users/<login>" | python3 -c "
import json,sys
u=json.load(sys.stdin)
print(u.get('name'), u.get('company'))
print(str(u['id'])+'+'+u['login']+'@users.noreply.github.com')
"
The GitHub noreply format is: <ID>+<login>@users.noreply.github.com
Use this as the canonical public email — it never exposes a personal address.
Step 3 — Build the .mailmap File
Format: Canonical Name <public@email> Commit Name <internal@corp.com>
# Verified contributors
Julian Maze <39711481+julianmaze@users.noreply.github.com> Julian Maze <Julian.Maze@corp.com>
Julian Maze <39711481+julianmaze@users.noreply.github.com> Maze, Julian <Julian.Maze@corp.com>
# Unverified — placeholder until contributor confirms their handle
Kevin Yang <kevin.yang@example.com> Kevin Yang <kevin.yang@corp.com>
# TODO: Kevin Yang must provide github.com username
# Service accounts
Vionix Bot <noreply@vionix.io> svc_vionix <svc_vionix@hq.corp.internal>
Commit name variants to cover per person:
Firstname Lastname
Lastname, Firstname (Microsoft/LDAP display name format)
- Short login alias (e.g.
mdesales)
See .mailmap in this repo for the Vionix contributor map.
Step 4 — Rewrite History with git-filter-repo
Warning: this rewrites all commit SHAs. Coordinate with all collaborators before running.
git filter-repo --mailmap .mailmap --dry-run
git filter-repo --mailmap .mailmap
git filter-repo --commit-callback '
if b"Signed-off-by" not in commit.message:
commit.message = commit.message.rstrip() + (
b"\n\nSigned-off-by: "
+ commit.author_name
+ b" <"
+ commit.author_email
+ b">"
)
'
Step 5 — Verify
git log --format="%ae" | grep -E "@corp\.com|@internal\." | wc -l
git shortlog --summary --email | head -20
Resolution Status for This Repo (.mailmap)
| Contributor | GHES login | github.com login | Status |
|---|
| Marcello DeSales | mdesales | marcellodesales | ✅ Verified |
| Julian Maze | jmaze | julianmaze | ✅ Verified (company=Viasat) |
| Mehk Panjabi | mpanjabi | mpanjabi | ✅ Verified (name match) |
| David Garcia | dlgarcia | dlgarcia808 | ⚠️ Org member, name unconfirmed |
| Kevin Yang | KYANG / kyang | unknown | ❌ TODO |
| James Maier | jamaier | unknown | ❌ TODO |
Related Skills
cncf-migration-secrets-scrubber — strip internal content before migration
cncf-migration-ghes-to-github — push clean history to public repo