İçeriğe geç

Başlarken

Kurulum

Pitmaster'i Composer üzerinden yükleyin:

Kabuk
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 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.