Back to list
laurigates

git-repository-detection

by laurigates

Claude Code plugins for development workflows

2🍴 0📅 Jan 24, 2026

SKILL.md


model: haiku created: 2025-12-16 modified: 2025-12-16 reviewed: 2025-12-16 name: Git Repository Detection description: Detect GitHub repository name and owner from git remotes. Use when needing repo identifier for GitHub CLI, API calls, or when working with multiple repositories. Automatically extracts owner/repo format. allowed-tools: Bash, Read, Grep

Git Repository Detection

Expert knowledge for detecting and extracting GitHub repository information from git remotes, including repository name, owner, and full identifiers.

Core Expertise

Repository Identification

  • Extract owner and repository name from git remotes
  • Parse GitHub URLs (HTTPS and SSH)
  • Handle GitHub Enterprise URLs
  • Format as owner/repo for CLI/API usage

URL Parsing

  • Parse HTTPS URLs: https://github.com/owner/repo.git
  • Parse SSH URLs: git@github.com:owner/repo.git
  • Handle custom domains: https://github.enterprise.com/owner/repo.git
  • Clean .git suffix and extra paths

Essential Commands

Get Remote URLs

# List all remotes
git remote -v

# Get origin URL
git remote get-url origin

# Get specific remote
git remote get-url upstream

# Show remote details
git remote show origin

Extract Repository Name

# From HTTPS URL
git remote get-url origin | sed 's/.*\/\([^/]*\)\.git/\1/'

# From SSH URL
git remote get-url origin | sed 's/.*:\([^/]*\/[^/]*\)\.git/\1/' | cut -d'/' -f2

# From any URL (owner/repo format)
git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/'

# Just repository name (no owner)
basename $(git remote get-url origin) .git

Extract Owner

# From any URL
git remote get-url origin | sed 's/.*[:/]\([^/]*\)\/[^/]*\.git/\1/'

# Alternative with awk
git remote get-url origin | awk -F '[:/]' '{print $(NF-1)}'

Get Full Identifier (owner/repo)

# Standard format for GitHub CLI/API
git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/'

# With validation
REPO=$(git remote get-url origin 2>/dev/null | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
echo "${REPO:-Unknown}"

# Store in variable
REPO_FULL=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
echo "Repository: $REPO_FULL"

URL Format Examples

HTTPS URLs

# Standard GitHub
https://github.com/owner/repo.git
# Extract: owner/repo

# Without .git suffix
https://github.com/owner/repo
# Extract: owner/repo

# GitHub Enterprise
https://github.company.com/owner/repo.git
# Extract: owner/repo

SSH URLs

# Standard SSH
git@github.com:owner/repo.git
# Extract: owner/repo

# Custom SSH port
ssh://git@github.com:443/owner/repo.git
# Extract: owner/repo

# Enterprise SSH
git@github.company.com:owner/repo.git
# Extract: owner/repo

Parsing Patterns

Universal Parser (HTTPS or SSH)

# Works for both HTTPS and SSH
parse_repo() {
  local url="$1"
  # Remove .git suffix
  url="${url%.git}"
  # Extract owner/repo
  if [[ "$url" =~ github\.com[:/]([^/]+/[^/]+) ]]; then
    echo "${BASH_REMATCH[1]}"
  elif [[ "$url" =~ :([^/]+/[^/]+)$ ]]; then
    echo "${BASH_REMATCH[1]}"
  fi
}

REPO=$(parse_repo "$(git remote get-url origin)")
echo "$REPO"

Robust Extraction with sed

# Handle both HTTPS and SSH, with or without .git
git remote get-url origin \
  | sed -E 's#.*github\.com[:/]##; s#\.git$##'

Using awk

# Split by : or / and get last two components
git remote get-url origin \
  | awk -F'[/:]' '{print $(NF-1)"/"$NF}' \
  | sed 's/\.git$//'

Real-World Usage

With GitHub CLI

# Get repo identifier for gh commands
REPO=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')

# Use with gh
gh repo view "$REPO"
gh issue list --repo "$REPO"
gh pr list --repo "$REPO"

# Or use current directory (gh auto-detects)
gh repo view

With GitHub API

# Extract for API calls
REPO=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
OWNER=$(echo "$REPO" | cut -d'/' -f1)
REPO_NAME=$(echo "$REPO" | cut -d'/' -f2)

# API request
curl -H "Authorization: token $GITHUB_TOKEN" \
  "https://api.github.com/repos/$OWNER/$REPO_NAME"

# Or use full identifier
curl -H "Authorization: token $GITHUB_TOKEN" \
  "https://api.github.com/repos/$REPO"

Check Multiple Remotes

# List all remotes with parsed names
git remote | while read remote; do
  url=$(git remote get-url "$remote")
  repo=$(echo "$url" | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
  echo "$remote: $repo"
done

# Output:
# origin: owner/repo
# upstream: original-owner/repo

Validate Repository Exists

# Extract and validate
REPO=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')

# Check if repo exists on GitHub
if gh repo view "$REPO" &>/dev/null; then
  echo "Repository exists: $REPO"
else
  echo "Repository not found or not accessible: $REPO"
fi

Clone URL from Identifier

# Given owner/repo, construct URLs
REPO="owner/repo"

# HTTPS
echo "https://github.com/${REPO}.git"

# SSH
echo "git@github.com:${REPO}.git"

Common Patterns

Script Integration

#!/bin/bash
# Get repository info for current directory

get_repo_info() {
  local origin_url=$(git remote get-url origin 2>/dev/null)

  if [[ -z "$origin_url" ]]; then
    echo "Error: Not a git repository or no origin remote" >&2
    return 1
  fi

  # Extract owner/repo
  local repo=$(echo "$origin_url" | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')

  # Split into owner and name
  local owner=$(echo "$repo" | cut -d'/' -f1)
  local name=$(echo "$repo" | cut -d'/' -f2)

  echo "Full: $repo"
  echo "Owner: $owner"
  echo "Name: $name"
}

get_repo_info

Environment Variables

# Set repo variables for scripts
export REPO_FULL=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
export REPO_OWNER=$(echo "$REPO_FULL" | cut -d'/' -f1)
export REPO_NAME=$(echo "$REPO_FULL" | cut -d'/' -f2)

# Use in scripts
gh issue create --repo "$REPO_FULL" --title "Bug Report"

Aliases

# Add to ~/.gitconfig or ~/.bashrc

# Git alias
git config --global alias.repo-name "!git remote get-url origin | sed 's/.*[\\/:]\\([^\\/]*\\/[^\\/]*\\)\\.git/\\1/'"

# Usage
git repo-name

# Shell alias
alias repo='git remote get-url origin | sed "s/.*[:/]\([^/]*\/[^/]*\)\.git/\1/"'

# Usage
repo

Edge Cases and Error Handling

No Remote

# Check if remote exists
if git remote get-url origin &>/dev/null; then
  REPO=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
  echo "Repository: $REPO"
else
  echo "Error: No origin remote configured"
fi

Multiple Remotes

# Use specific remote (origin, upstream, etc.)
REMOTE="${1:-origin}"

if git remote get-url "$REMOTE" &>/dev/null; then
  REPO=$(git remote get-url "$REMOTE" | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
  echo "Repository ($REMOTE): $REPO"
else
  echo "Error: Remote '$REMOTE' not found"
fi

Non-GitHub Remotes

# Check if it's a GitHub URL
URL=$(git remote get-url origin)

if [[ "$URL" =~ github\.com ]]; then
  REPO=$(echo "$URL" | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')
  echo "GitHub Repository: $REPO"
else
  echo "Not a GitHub repository: $URL"
fi

Submodules

# Get parent repo
PARENT_REPO=$(git -C "$(git rev-parse --show-toplevel)" remote get-url origin \
  | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')

# Get submodule repo
SUBMODULE_REPO=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')

Integration Examples

With Makefile

# Makefile
REPO := $(shell git remote get-url origin | sed 's/.*[:/]\([^\/]*\/[^\/]*\)\.git/\1/')
OWNER := $(shell echo $(REPO) | cut -d'/' -f1)
NAME := $(shell echo $(REPO) | cut -d'/' -f2)

.PHONY: info
info:
	@echo "Repository: $(REPO)"
	@echo "Owner: $(OWNER)"
	@echo "Name: $(NAME)"

.PHONY: open
open:
	@open "https://github.com/$(REPO)"

With Shell Scripts

#!/bin/bash
# deploy.sh

set -e

# Get repository identifier
REPO=$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')

if [[ -z "$REPO" ]]; then
  echo "Error: Could not determine repository" >&2
  exit 1
fi

echo "Deploying $REPO..."

# Use repo identifier
gh workflow run deploy.yml --repo "$REPO"

With Python Scripts

#!/usr/bin/env python3
import subprocess
import re

def get_repo_name():
    """Extract GitHub repository owner/name from git remote."""
    try:
        result = subprocess.run(
            ['git', 'remote', 'get-url', 'origin'],
            capture_output=True,
            text=True,
            check=True
        )
        url = result.stdout.strip()

        # Parse owner/repo from URL
        match = re.search(r'github\.com[:/](.+/.+?)(?:\.git)?$', url)
        if match:
            return match.group(1)
        return None
    except subprocess.CalledProcessError:
        return None

if __name__ == '__main__':
    repo = get_repo_name()
    if repo:
        print(f"Repository: {repo}")
    else:
        print("Error: Could not determine repository")

Quick Reference

One-Liners

# Full identifier (owner/repo)
git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/'

# Owner only
git remote get-url origin | sed 's/.*[:/]\([^/]*\)\/[^/]*\.git/\1/'

# Name only
basename $(git remote get-url origin) .git

# Check if GitHub repo
git remote get-url origin | grep -q github.com && echo "GitHub" || echo "Not GitHub"

Common Commands

# View on GitHub (macOS)
open "https://github.com/$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')"

# View on GitHub (Linux)
xdg-open "https://github.com/$(git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/')"

# Copy to clipboard (macOS)
git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/' | pbcopy

# Copy to clipboard (Linux)
git remote get-url origin | sed 's/.*[:/]\([^/]*\/[^/]*\)\.git/\1/' | xclip -selection clipboard

Validation

# Ensure in git repo
git rev-parse --git-dir &>/dev/null || { echo "Not a git repository"; exit 1; }

# Ensure origin exists
git remote get-url origin &>/dev/null || { echo "No origin remote"; exit 1; }

# Ensure it's GitHub
git remote get-url origin | grep -q github.com || { echo "Not a GitHub repo"; exit 1; }

Troubleshooting

Remote Not Found

# Check configured remotes
git remote -v

# Add origin if missing
git remote add origin git@github.com:owner/repo.git

Wrong Remote

# Use different remote
git remote get-url upstream

# Set correct origin
git remote set-url origin git@github.com:owner/repo.git

Parse Failure

# Debug: Show raw URL
git remote get-url origin

# Check format matches expected pattern
# HTTPS: https://github.com/owner/repo.git
# SSH:   git@github.com:owner/repo.git

Best Practices

Caching

  • Cache repository identifier in scripts
  • Don't repeatedly call git commands
  • Store in environment variables

Error Handling

  • Always check if remote exists
  • Validate URL format before parsing
  • Provide fallback values

Portability

  • Use portable sed/awk syntax
  • Test on different shells (bash, zsh, etc.)
  • Handle both HTTPS and SSH URLs

Security

  • Don't expose tokens in URLs
  • Use SSH for private repositories
  • Validate repository access

Integration with Other Skills

Combine with:

  • github MCP - Use extracted repo name with GitHub API
  • github-actions-inspection - Pass repo to gh CLI commands
  • git-workflow - Identify repo for workflow operations

Workflow:

  1. Detect repository (this skill)
  2. Use identifier with GitHub CLI/API
  3. Perform operations on correct repository

Resources

  • git remote documentation: man git-remote
  • GitHub CLI: Uses repository detection automatically
  • GitHub API: Requires owner/repo format

Score

Total Score

50/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon