0Pricing
AI Agents · Ders

İşleme Geçmişi ve Fark Analizi

İşleme geçmişinde gezinme, değişen dosyaları çıkarma ve farkları özetleme.

İşleme Geçmişi ve Fark Analizi, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

İşleme Geçmişi Neden Analiz Edilir

İşleme geçmişi aracılar için bir bilgi hazinesidir: neyin, ne zaman ve kim tarafından değiştirildiğini ortaya çıkarır. Aracılar işleme geçmişini değişiklik günlüğü oluşturmak, kod inceleme özetleri hazırlamak, geliştirici etkinliği raporları oluşturmak, riskleri (sürümlere yakın tarihlerde yapılan büyük değişiklikleri) tespit etmek ve bir kod tabanının nasıl geliştiğini anlamak için kullanır.

from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

# Get recent commits on the default branch
commits = repo.get_commits()
print(f'Total commits: {commits.totalCount}')

# Preview the last 5
for commit in commits[:5]:
    print(f'{commit.sha[:8]} | {commit.commit.author.name}')
    print(f'  {commit.commit.message.split(chr(10))[0][:60]}')
    print(f'  {commit.commit.author.date.date()}')

İşlemeleri Zaman Aralığına Göre Filtreleme

Belirli bir tarih aralığındaki işlemeleri almak için since ve until parametrelerini kullanın. Her ikisi de Python datetime nesnelerini kabul eder. Bu, haftalık veya aylık etkinlik raporları oluşturmanın temel aracıdır.

import datetime
from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

# Last 7 days of commits
now = datetime.datetime.utcnow()
last_week = now - datetime.timedelta(days=7)

recent_commits = repo.get_commits(
    since=last_week,
    until=now
)

print(f'Commits in last 7 days: {recent_commits.totalCount}')

# By specific author
author_commits = repo.get_commits(
    since=last_week,
    author='alice'  # GitHub username
)
print(f'Alice\'s commits last week: {author_commits.totalCount}')

# On a specific branch
branch_commits = repo.get_commits(
    sha='feature/new-api',
    since=last_week
)

İşleme İstatistikleri: Eklemeler ve Silmeler

Her işleme nesnesinde, değişen tüm dosyalardaki additions, deletions ve total değişiklik sayılarını içeren bir stats özelliği bulunur. Bu, bir değişikliğin boyutu hakkında hızlıca fikir edinmenizi sağlar.

from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

commit = repo.get_commit('abc12345sha')

# Overall stats
print(f'SHA: {commit.sha[:8]}')
print(f'Message: {commit.commit.message[:80]}')
print(f'Author: {commit.commit.author.name}')
print(f'Date: {commit.commit.author.date}')
print(f'Additions: +{commit.stats.additions}')
print(f'Deletions: -{commit.stats.deletions}')
print(f'Total changes: {commit.stats.total}')

# Large commit warning
if commit.stats.total > 500:
    print('WARNING: Large commit — careful code review needed')

Bir İşlemede Değişen Dosyaları Listeleme

commit.files, işlemede değişen her dosya için bir File nesneleri listesidir. Özellikler: filename, status (eklenmiş/değiştirilmiş/kaldırılmış/yeniden adlandırılmış), additions, deletions, patch (fark metni).

from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
commit = repo.get_commit('abc12345sha')

print(f'Files changed: {len(commit.files)}')

for f in commit.files:
    print(f'  [{f.status.upper():<8}] {f.filename}')
    print(f'    +{f.additions} -{f.deletions}')
    if f.previous_filename:  # for renamed files
        print(f'    Renamed from: {f.previous_filename}')

# Find changed Python files
python_changes = [
    f for f in commit.files
    if f.filename.endswith('.py')
]
print(f'\nPython files changed: {len(python_changes)}')

Fark (Yama) Metnini Ayrıştırma

file.patch, birleştirilmiş bir fark içerir. + ile başlayan satırlar eklemeleri, - ile başlayan satırlar silmeleri belirtir; bağlam satırlarının ise ön eki yoktur. Analiz için eklenen satırları çıkarmak üzere bu metni ayrıştırın; örneğin yeni gizli bilgileri, TODO yorumlarını veya kötü örüntüleri bulmak için.

def extract_added_lines(patch):
    if not patch:
        return []
    added = []
    for line in patch.split('\n'):
        if line.startswith('+') and not line.startswith('+++'): 
            added.append(line[1:])  # strip the '+' prefix
    return added

def scan_for_secrets(added_lines):
    import re
    PATTERNS = [
        (r'api[_-]?key\s*=\s*["\'][^"\']{20,}', 'potential API key'),
        (r'password\s*=\s*["\'][^"\']{6,}', 'potential hardcoded password'),
        (r'sk-[a-zA-Z0-9]{20,}', 'potential OpenAI key'),
        (r'ghp_[a-zA-Z0-9]{36}', 'potential GitHub token'),
    ]
    findings = []
    for i, line in enumerate(added_lines, 1):
        for pattern, label in PATTERNS:
            if re.search(pattern, line, re.IGNORECASE):
                findings.append({'line': i, 'type': label, 'preview': line[:80]})
    return findings

# --- demo ---
patch = (
    '@@ -1,2 +1,3 @@\n'
    ' def connect():\n'
    '+    api_key = "sk-abcdefghijklmnopqrstuvwx"\n'
    '+    password = "hunter2222"\n'
)
added = extract_added_lines(patch)
print('Added lines:', added)
for finding in scan_for_secrets(added):
    print(finding)

Etkinliği Yazara Göre Toplama

Geliştirici etkinliği raporları oluşturmak için işlemeleri yazara göre gruplandırın. Bir zaman aralığında her yazar için işleme sayısını, eklenen ve silinen satırları ve dokunulan dosyaları sayın. Bu, ekiplerin geriye dönük değerlendirmeleri ve PR atama kararları için kullanışlıdır.

import datetime
from collections import defaultdict
from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

last_month = datetime.datetime.utcnow() - datetime.timedelta(days=30)

author_stats = defaultdict(lambda: {'commits': 0, 'additions': 0, 'deletions': 0, 'files': set()})

for commit in repo.get_commits(since=last_month):
    author = commit.commit.author.name
    author_stats[author]['commits'] += 1
    author_stats[author]['additions'] += commit.stats.additions
    author_stats[author]['deletions'] += commit.stats.deletions
    for f in commit.files:
        author_stats[author]['files'].add(f.filename)

print('Author Activity (last 30 days):')
for author, stats in sorted(author_stats.items(), key=lambda x: -x[1]['commits']):
    print(f'{author}: {stats["commits"]} commits, +{stats["additions"]} -{stats["deletions"]}, {len(stats["files"])} files')

İşlemelerden Değişiklik Günlüğü Oluşturma

Bir değişiklik günlüğü aracısı, iki etiket veya tarih arasındaki işlemeleri okur, bunları türe göre gruplandırır (geleneksel işleme biçimindeki özellik, düzeltme ve bakım türlerini kullanarak) ve biçimlendirilmiş bir değişiklik günlüğü oluşturur. Her işlemenin açıklama kalitesini artırmak için bir LLM kullanın.

import re
import datetime
from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

def get_commits_since_tag(repo, tag_name):
    try:
        ref = repo.get_git_ref(f'tags/{tag_name}')
        tag_sha = ref.object.sha
        tag_commit = repo.get_commit(tag_sha)
        since = tag_commit.commit.author.date
        return list(repo.get_commits(since=since))[:-1]  # exclude the tag commit
    except Exception:
        return []

def parse_conventional_commit(message):
    match = re.match(r'^(feat|fix|chore|docs|test|refactor|perf|style)(\(.+?\))?: (.+)', message)
    if match:
        return match.group(1), match.group(3)
    return 'other', message.split('\n')[0][:60]

commits = get_commits_since_tag(repo, 'v1.2.0')
by_type = {'feat': [], 'fix': [], 'other': []}
for c in commits:
    msg = c.commit.message
    ctype, desc = parse_conventional_commit(msg)
    by_type.get(ctype, by_type['other']).append(desc)
print(f'Parsed {len(commits)} commits')

Yüksek Riskli İşlemeleri Belirleme

Yüksek riskli işlemeler; büyük olan, kritik dosyalara (kimlik doğrulama, ödeme, güvenlik) dokunan veya bir sürüme çok yakın zamanda yapılan işlemelerdir. Bir aracı, bunları ana dala birleştirmeden önce daha ayrıntılı incelenmeleri için işaretleyebilir.

import datetime
from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

CRITICAL_PATHS = [
    'src/auth', 'src/payment', 'src/security',
    'config/', '.env', 'Dockerfile', 'requirements.txt'
]

def is_high_risk(commit):
    reasons = []

    # Large change
    if commit.stats.total > 300:
        reasons.append(f'Large change: {commit.stats.total} lines')

    # Touches critical files
    for f in commit.files:
        for path in CRITICAL_PATHS:
            if f.filename.startswith(path):
                reasons.append(f'Touches critical: {f.filename}')
                break

    return reasons

now = datetime.datetime.utcnow()
for commit in repo.get_commits(since=now - datetime.timedelta(days=1)):
    risks = is_high_risk(commit)
    if risks:
        print(f'HIGH RISK: {commit.sha[:8]} - {commit.commit.message[:50]}')
        for r in risks:
            print(f'  - {r}')

İki İşlemeyi Karşılaştırma

İki başvuru noktası (dallar, etiketler veya işleme SHA'ları) arasındaki farkı almak için repo.compare(base, head) kullanın. Bu işlem, iki nokta arasındaki birleştirilmiş istatistikleri, işleme listesini ve değişen dosyalar listesini içeren bir Comparison nesnesi döndürür.

from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

# Compare two branches
comparison = repo.compare('main', 'feature/new-api')

print(f'Commits ahead: {comparison.ahead_by}')
print(f'Commits behind: {comparison.behind_by}')
print(f'Status: {comparison.status}')  # ahead/behind/identical/diverged
print(f'Total commits in diff: {len(comparison.commits)}')
print(f'Files changed: {len(comparison.files)}')

# Summary of what changed
for f in comparison.files:
    print(f'  {f.status}: {f.filename} +{f.additions} -{f.deletions}')

# Compare two tags
tag_comparison = repo.compare('v1.0.0', 'v1.1.0')
print(f'Changes between v1.0.0 and v1.1.0: {len(tag_comparison.commits)} commits')

LLM Destekli İşleme Özeti

Bir zaman aralığında nelerin değiştiğine dair insanların okuyabileceği bir özet oluşturmak için bir işleme iletileri ve dosya adları grubunu bir LLM'ye verin. Bu, haftalık mühendislik özeti botunun temelini oluşturur.

import anthropic
import os

client = anthropic.Anthropic(api_key=os.environ['ANTHROPIC_API_KEY'])

def summarize_commits(commits, time_period='last week'):
    commit_data = []
    for commit in commits[:30]:  # limit to avoid context overflow
        commit_data.append(
            f'- {commit.commit.message.split(chr(10))[0][:80]} '
            f'(+{commit.stats.additions}/-{commit.stats.deletions})'
        )

    commit_list = '\n'.join(commit_data)
    prompt = (
        f'Summarize what happened in this codebase {time_period} '
        f'based on these commit messages. Be concise (3-5 bullet points). '
        f'Focus on user-facing changes and significant technical work.\n\n'
        f'Commits:\n{commit_list}'
    )

    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=400,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return response.content[0].text

İşlemelerde Hassas Dosyaları Tespit Etme

Güvenlik odaklı bir işleme analiz aracısı, yanlışlıkla hassas dosyalar içeren işlemeleri tarar: özel anahtarlar, .env dosyaları, kimlik bilgileri içeren yapılandırmalar veya veritabanı dökümleri. Bilinen hassas örüntülerle eşleşen dosya adlarını bulmak için commit.files değerini kontrol edin.

import re
from github import Github
import os

g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')

SENSITIVE_PATTERNS = [
    r'\.env$', r'\.pem$', r'\.key$', r'id_rsa', r'credentials\.json',
    r'secret', r'password', r'\.p12$', r'keystore', r'\btoken\b'
]

def is_sensitive_filename(filename):
    for pattern in SENSITIVE_PATTERNS:
        if re.search(pattern, filename, re.IGNORECASE):
            return pattern
    return None

import datetime
last_day = datetime.datetime.utcnow() - datetime.timedelta(days=1)

for commit in repo.get_commits(since=last_day):
    for f in commit.files:
        matched = is_sensitive_filename(f.filename)
        if matched and f.status in ('added', 'modified'):
            print(f'ALERT: Sensitive file in commit {commit.sha[:8]}')
            print(f'  File: {f.filename} (matched: {matched})')
            print(f'  Author: {commit.commit.author.name}')
            print(f'  Link: {commit.html_url}')

Hızlı Kontrol: commit.files ve pr.get_files() Karşılaştırması

İşleme farklarına erişimi ne kadar anladığınızı sınayın.

İşleme Geçmişi Analizi Özeti

Aracınız artık işleme geçmişini kapsamlı biçimde analiz edebilir:

  • repo.get_commits(since, until, author, sha) — işlemeleri zamana, yazara veya dala göre filtreleyin
  • commit.stats — değişen tüm dosyalardaki ekleme/silme/toplam sayıları
  • commit.files — yama (birleştirilmiş fark) dahil dosya başına ayrıntılar
  • Gizli bilgileri, TODO'ları veya kötü örüntüleri taramak için file.patch değerini ayrıştırın
  • Etkinlik raporları için işlemeleri yazara göre gruplandırın
  • repo.compare(base, head) — iki başvuru noktası (dallar, etiketler, SHA'lar) arasındaki fark
  • İşleme ileti listelerinden insanların okuyabileceği özetler oluşturmak için LLM'leri kullanın
  • Yüksek riskli işlemeleri işaretleyin: büyük değişiklikler + kritik dosyalar + sürümlere yakınlık

Sıkça Sorulan Sorular

“İşleme Geçmişi ve Fark Analizi” dersi ücretsiz mi?

Evet — “İşleme Geçmişi ve Fark Analizi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“İşleme Geçmişi ve Fark Analizi” dersinde ne öğreneceğim?

İşleme geçmişinde gezinme, değişen dosyaları çıkarma ve farkları özetleme. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“İşleme Geçmişi ve Fark Analizi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. GitHub REST API'ye Genel Bakış
  2. Sorunları Listeleme ve Yönetme
  3. Otomatik PR İnceleme Yorumları
  4. İşleme Geçmişi ve Fark Analizi
← AI Agents Sayfasına Dön