
# Başlarken

## Kurulum

Pitmaster'i Composer üzerinden yükleyin:

```bash
composer require pitmaster/pitmaster
```

## Gereksinimler

- **salt okunur sınıflar, enum'lar ve kurucu yükseltmesi sunan PHP 8.2+**
- Nesne sıkıştırma/açma için **ext-zlib** (çoğu kurulumda yerleşik)
- İşlem durumu dosyaları ve Git LFS API yükleri için **ext-json**
- **ext-mbstring**, `composer.json` içinde bildirilmiştir; bu nedenle Composer kurulum sırasında bunu gerektirir
- Özet doğrulaması için **ext-ctype** (çoğu PHP derlemesinde etkindir ancak `composer.json` içinde bildirilmemiştir)

Temel depo işlemleri için `git` ikili dosyası, FFI veya harici yardımcılar gerekmez. İsteğe bağlı özelliklerin ek çalışma zamanı gereksinimleri vardır: hook yürütme için `proc_open()` kullanılır; SSH aktarımında ise yüklüyse `ext-ssh2` kullanılır, yüklü değilse `proc_open()` üzerinden sistemin `ssh` ikili dosyası başlatılır.

## Mevcut bir depoyu açın

```php
use Pitmaster\Pitmaster;

$repo = Pitmaster::open('/path/to/project');
```

Bu, verilen yoldaki depoyu açar. Pitmaster, `.git` dizinini bulur (veya bağlantılı çalışma ağaçları için bir `.git` dosyasını çözümler) ve nesne veritabanını, ref veritabanını ve yapılandırmayı başlatır.

`open()`, `init()` ve `clone()`, son bağımsız değişken olarak bir seçenekler dizisi kabul eder:

```php
// Do not run .git/hooks scripts for this handle
$repo = Pitmaster::open('/path/to/project', ['hooks' => false]);

// Do not start any process: no hooks, no fsmonitor hook, no clone/fetch/push, no SSH
$repo = Pitmaster::open('/path/to/project', Pitmaster::processFreeOptions());
```

Hook'lar varsayılan olarak çalıştırılır. `Pitmaster::processFreeOptions()`, `['processes' => false, 'hooks' => false]` döndürür; bu tanıtıcıyla yerel okuma ve yazmalar çalışmaya devam eder.

## Bir yolun depo olup olmadığını kontrol edin

```php
if (Pitmaster::isRepository('/path/to/project')) {
    $repo = Pitmaster::open('/path/to/project');
}
```

## Yeni bir depo başlatın

```php
$repo = Pitmaster::init('/path/to/new-project');
```

Bu işlem, nesneler, ref'ler, HEAD (`refs/heads/main`'e işaret eden) ve varsayılan bir yapılandırma içeren `.git` dizin yapısını oluşturur.

Bir SHA-256 deposu oluşturmak için nesne biçimini ikinci bağımsız değişken olarak geçirin:

```php
$repo = Pitmaster::init('/path/to/new-project', 'sha256');
```

Bu depodaki nesne kimlikleri 64 onaltılık karakter uzunluğundadır ve yapılandırma `extensions.objectformat = sha256` değerini kaydeder. Daha sonra açılan depolar biçimi bu yapılandırma girdisinden alır.

## HEAD commit'ini okuyun

```php
$head = $repo->head();

echo "Commit: {$head->id->hex}\n";
echo "Author: {$head->author}\n";
echo "Message: {$head->message}\n";
```

`head()` yöntemi HEAD'i çözümler (sembolik ref'leri izleyerek) ve bir `Commit` nesnesi döndürür.

## Dalları ve tag'leri listeleyin

```php
// All branch names
$branches = $repo->branches();
// ['main', 'feature/login', 'bugfix/typo']

// Current branch name (null if detached)
$current = $repo->branch();
// 'main'

// All tag names
$tags = $repo->tags();
// ['v1.0.0', 'v1.1.0']
```

## Commit geçmişinde gezinin

```php
// Last 20 commits from HEAD
$commits = $repo->log(20);

foreach ($commits as $commit) {
    echo substr($commit->id->hex, 0, 7) . " {$commit->message}\n";
}
```

Belirli bir commit'ten de başlayabilirsiniz:

```php
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);
```

## Çalışma ağacı durumunu kontrol edin

```php
use Pitmaster\Status\FileStatus;

$entries = $repo->status();

foreach ($entries as $entry) {
    if ($entry->index === FileStatus::Untracked) {
        echo "?? {$entry->path}\n";
    } elseif ($entry->index === FileStatus::Modified) {
        echo "M  {$entry->path}\n";
    } elseif ($entry->worktree === FileStatus::Modified) {
        echo " M {$entry->path}\n";
    }
}
```

## Dosyaları hazırlayın ve commit oluşturun

```php
// Stage specific files
$repo->add('src/Feature.php', 'tests/FeatureTest.php');

// Create a commit
$commitId = $repo->commit('Add new feature with tests');

echo "Created commit: {$commitId->hex}\n";
```

Yazarın adı ve e-postası şu sırayla çözümlenir: `PITMASTER_AUTHOR_NAME` / `PITMASTER_AUTHOR_EMAIL` ortam değişkenleri, `GIT_AUTHOR_NAME` / `GIT_AUTHOR_EMAIL` ortam değişkenleri, `PITMASTER_AUTHOR_NAME` / `PITMASTER_AUTHOR_EMAIL` sabitleri, deponun kendi `.git/config` ayarı (`user.name` ve `user.email`) ve son olarak `Pitmaster <pitmaster@localhost>`. Yalnızca depo yapılandırma dosyası ve eklediği dosyalar okunur; `~/.gitconfig` okunmaz. Commit'i oluşturan kişi aynı şekilde `*_COMMITTER_*` adlarından çözümlenir ve yazar sabitleri yoksa bunlara başvurulur.

## Farkları hesaplayın

```php
// Unstaged changes (worktree vs index)
$diffs = $repo->diff();

foreach ($diffs as $diff) {
    echo $diff->format(); // Unified diff output
}

// Staged changes (index vs HEAD)
$staged = $repo->diffStaged();
```

## Uzak depoyu klonlayın

```php
$repo = Pitmaster::clone('https://github.com/user/repo.git', '/path/to/destination');
```

Bu işlem ref'leri keşfeder, pack dosyasını getirir, uzak izleme dallarını ayarlar ve varsayılan dalı checkout eder. HTTP(S) URL'leri akıllı HTTP kullanır ve başarısız olursa basit HTTP yöntemine geçer; SSH URL'leri SSH aktarımını kullanır. Sığ klonlama için üçüncü argüman olarak derinlik belirtin: `Pitmaster::clone($url, $path, 1)`.

## Hash ile herhangi bir nesneyi okuyun

```php
$object = $repo->readObject($fullHash); // full 40-character (or 64 for SHA-256) hex hash

if ($object instanceof \Pitmaster\Object\Blob) {
    echo $object->content;
} elseif ($object instanceof \Pitmaster\Object\Commit) {
    echo $object->message;
}
```

## Yapılandırma

Pitmaster, yazar bilgileri ve uzak URL'ler için deponun `.git/config` ayarlarına uyar. Ayrıca, Pitmaster çalışmadan önce tanımlanan PHP sabitleriyle genel varsayılanları da ayarlayabilirsiniz:

```php
define('PITMASTER_AUTHOR_NAME', 'Your Name');
define('PITMASTER_AUTHOR_EMAIL', 'you@example.com');
define('PITMASTER_HTTP_TIMEOUT', 60);        // Seconds
define('PITMASTER_MAX_DELTA_CHAIN', 50);     // Max delta chain depth
define('PITMASTER_OBJECT_CACHE_BYTES', '64M');
```

| Sabit | Varsayılan | Etki |
|----------|---------|--------|
| `PITMASTER_AUTHOR_NAME`, `PITMASTER_AUTHOR_EMAIL` | yok | Yazar kimliği (yukarıdaki sıraya bakın) |
| `PITMASTER_COMMITTER_NAME`, `PITMASTER_COMMITTER_EMAIL` | yazar değerleri | Commit'i oluşturanın kimliği |
| `PITMASTER_HTTP_TIMEOUT` | `30` | Akıllı HTTP zaman aşımı (saniye cinsinden tamsayı) |
| `PITMASTER_MAX_DELTA_CHAIN` | `50` | Pack'leri okurken izin verilen en büyük delta zinciri derinliği (tamsayı) |
| `PITMASTER_OBJECT_CACHE_ENTRIES` | `1024` | Bellek içi nesne önbelleğinde tutulan nesneler |
| `PITMASTER_OBJECT_CACHE_BYTES` | `16M` | Nesne önbelleğinin bayt cinsinden sınırı |
| `PITMASTER_PACK_RESOLVED_CACHE_ENTRIES` | `4096` | Pack başına önbelleğe alınan çözümlenmiş delta nesneleri |
| `PITMASTER_PACK_RESOLVED_CACHE_BYTES` | `32M` | Bu pack önbelleğinin bayt cinsinden sınırı |
| `PITMASTER_MAX_PACK_MEMORY` | yok | Pack önbelleği bayt sınırının eski adı; yalnızca `PITMASTER_PACK_RESOLVED_CACHE_BYTES` tanımlı değilse kullanılır |

Bayt değerleri bir tamsayı veya `k`, `m` ya da `g` son ekine sahip bir dize (`'256M'`) olabilir. Geçersiz değerlerde varsayılan kullanılır.

Ortam değişkenleri kimlik sabitlerini geçersiz kılar: `PITMASTER_AUTHOR_NAME`, `PITMASTER_AUTHOR_EMAIL`, `PITMASTER_AUTHOR_DATE`, bunların `PITMASTER_COMMITTER_*` eşdeğerleri ve git'ün kendi `GIT_AUTHOR_*` ve `GIT_COMMITTER_*` değişkenleri. SSH aktarımı, [Protokoller](https://pitmaster.inline0.dev/tr/docs/network/protocols) bölümünde açıklanan `PITMASTER_SSH_*` değişkenlerini okur.

Hash algoritması için bir sabit yoktur. Nesne biçimi depo oluşturulurken seçilir (CLI üzerinde `Pitmaster::init($path, 'sha256')` veya `init --object-format=sha256`) ve daha sonra depo yapılandırmasından okunur.
