Başlarken
Kurulum
Pitmaster'i Composer üzerinden yükleyin:
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.jsoniç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.jsoniç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
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:
// 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
if (Pitmaster::isRepository('/path/to/project')) {
$repo = Pitmaster::open('/path/to/project');
}
Yeni bir depo başlatın
$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:
$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
$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
// 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
// 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:
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);
Çalışma ağacı durumunu kontrol edin
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
// 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
// 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
$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
$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:
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.