Pitmaster
Git는 PHP에서 저장소를 읽고 쓰며, diff와 병합을 수행하고, 셸로 git을 실행하지 않고 스마트 HTTP 통신을 합니다.
composer require pitmaster/pitmaster최신 릴리스 v0.2.11 MIT PHP 8.2+
# List all branches (current marked with *)
./bin/pitmaster branch
# Create a new branch from HEAD
./bin/pitmaster branch feature/new-thing
# Delete a branch
./bin/pitmaster branch -d feature/old
./bin/pitmaster branch -D feature/old실제 사용
저장소를 연 다음 메서드 호출이나 셸을 통해 읽고 씁니다.
PHP에서 저장소 읽기
Pitmaster::open()는 .git 디렉터리를 찾아 저장소 핸들을 반환합니다. 각 상태 항목에는 인덱스와 작업 트리에 대한 별도의 상태가 담깁니다.
셸에서 ./vendor/bin/pitmaster는 git 명령 일부를 미러링하며 0.2.11이므로 Composer 설치 환경에서도 작동합니다.
use Pitmaster\Pitmaster;
$repo = Pitmaster::open('/path/to/project');
// Read the current HEAD commit
$head = $repo->head();
echo $head->message;
// List branches
foreach ($repo->branches() as $branch) {
echo $branch . "\n";
}
// Check status
foreach ($repo->status() as $entry) {
echo "{$entry->path}: {$entry->index->value}{$entry->worktree->value}\n";
}./vendor/bin/pitmaster log
./vendor/bin/pitmaster status
./vendor/bin/pitmaster diff
./vendor/bin/pitmaster show HEAD
./vendor/bin/pitmaster add file.txt
./vendor/bin/pitmaster commit -m "message"
./vendor/bin/pitmaster branch feature
./vendor/bin/pitmaster checkout feature
./vendor/bin/pitmaster merge featuregit 바이너리 불필요
핵심 작업은 git 바이너리나 FFI 없이 PHP 8.2+에서 실행됩니다. 훅과 SSH 대체 방식은 프로세스를 시작합니다. ['hooks' => false] 또는 processFreeOptions()를 전달하면 비활성화됩니다.
읽기 및 쓰기
느슨한 객체, 델타 해석을 포함한 팩 파일, 인덱스, 참조, 설정을 지원합니다. git은 인덱스 버전 2 및 3과 느슨한 참조에 대해 Pitmaster가 기록한 데이터를 읽습니다.
Diff 및 병합
이름 변경 감지를 지원하는 Myers, patience, histogram diff. 충돌 마커를 사용하는 3방향 병합.
네트워크 프로토콜
스마트 HTTP 또는 SSH를 통해 복제, 가져오기, 푸시를 지원하며, 복제와 가져오기는 dumb HTTP 대체 방식을 사용합니다. 프로토콜 v2는 하위 수준 클라이언트에서 사용할 수 있습니다.
Git 작업
추가, 커밋, 상태, diff, 병합, 체크아웃, 초기화, 스태시, 체리 픽, 되돌리기, 리베이스, 블레임, grep.
CLI
init, log, status, diff, add, commit, branch, merge, stash, blame, grep을 포함한 git 스타일 명령 22개. clone, fetch, push는 라이브러리에서만 사용할 수 있습니다.
오라클 테스트 완료
761개 시나리오는 실제 git에서 캡처한 출력과 결과를 비교하며 CI에서 실행됩니다. 605개 시나리오는 git 자체, libgit2, go-git, isomorphic-git, dulwich 및 JGit의 테스트 모음에서 가져왔습니다.
전체 검색
셸에서 git을 실행하지 않고 blame, grep, bisect, notes 및 로그 경로 필터를 사용할 수 있습니다.
Pitmaster를 사용하는 이유
git 설치 없이 작동
커밋, diff, 상태, 기록을 PHP에서 계산하므로 git 바이너리가 없는 컨테이너와 호스트에서도 저장소 작업을 할 수 있습니다.
프로세스를 시작하지 않는 핸들
Pitmaster::processFreeOptions()는 훅, fsmonitor 훅, clone, fetch, push, SSH 프로세스 전송을 비활성화합니다. 로컬 읽기 및 쓰기는 계속 작동합니다.
git과 대조 검증
통합 테스트는 git 바이너리를 대상으로 실행되며, 지원 매트릭스는 선언된 호환성 범위 내에서 해당 범위에 포함된 기능 146개 중 146개가 기준 구현으로 검증되었는지 보여줍니다.
SHA-1 및 SHA-256
SHA-256 저장소를 Pitmaster::init($path, 'sha256') 또는 init --object-format=sha256로 만드세요. 팩 파일은 읽고 쓸 수 있으며, commit-graph, multi-pack index, reftable 파일은 읽을 수 있습니다.
비교 대상
PHP에서 Git 저장소를 다루는 다른 방법과 Pitmaster와의 차이점을 살펴봅니다.
| 도구 | 잘하는 점 | Pitmaster와의 차이점 |
|---|---|---|
| git (명령줄) | 잘하는 점참조 구현으로, 고수준 작업과 내부 기능에 대한 전체 액세스를 모두 지원하는 풍부한 명령 세트를 제공합니다. | Pitmaster와의 차이점Pitmaster는 PHP 프로세스 내부에서 실행되며 핵심 작업은 git을 셸로 호출하지 않습니다. CLI는 git 명령의 일부만 구현합니다. |
| czproject/git-php | 잘하는 점init, clone, commit, merge, 브랜치, 태그 및 원격 저장소를 위한 간결한 PHP API입니다. PHP 8.0 이상에서 실행되며 설치된 git 클라이언트를 사용합니다. | Pitmaster와의 차이점Pitmaster는 객체, 팩 파일 및 인덱스를 직접 읽고 쓰므로 핵심 작업에 git 클라이언트가 필요하지 않습니다. PHP 8.2 이상이 필요합니다. |
| gitonomy/gitlib | 잘하는 점빌드 없이 PHP 8.4 이상에서 저장소에 액세스합니다. git을 셸 명령으로 호출해 작동합니다. | Pitmaster와의 차이점Pitmaster는 핵심 작업에서 셸을 호출하지 않으며, 프로세스 없는 핸들을 사용하면 프로세스를 시작하는 기능이 비활성화됩니다. |
| libgit2 | 잘하는 점Git 핵심 메서드를 링크 가능한 라이브러리로 구현한 이식성 높은 C 구현으로, Ruby, .NET, Python, Node.js, Rust 등을 위한 바인딩을 제공합니다. | Pitmaster와의 차이점Pitmaster는 Composer와 함께 설치되는 순수 PHP이며, 컴파일된 라이브러리나 FFI가 없습니다. libgit2 테스트 리소스에서 기준 시나리오 63개를 가져옵니다. |
질문과 답변
Pitmaster 문서의 간단한 답변.
아니요. 핵심 저장소 작업은 git 바이너리나 FFI를 사용하지 않습니다. 객체, ref, 팩 파일, 인덱스 및 스마트 HTTP를 PHP에서 처리합니다.
예. 저장소를 열 때 Pitmaster::processFreeOptions() 또는 ['processes' => false]를 전달하세요. 그러면 후크, clone, fetch, push 및 SSH 프로세스 전송이 비활성화되고 로컬 읽기 및 쓰기는 계속 사용할 수 있습니다.
예. 후크는 기본적으로 활성화되어 있으며 proc_open()를 통해 실행됩니다. Pitmaster::open(), Pitmaster::init() 또는 Pitmaster::clone()에 ['hooks' => false]를 전달하면 해당 핸들에서 .git/hooks의 스크립트를 건너뜁니다.
Pitmaster::clone(), fetch() 및 push()는 SSH URL에 SSH를 사용하고, 그 외에는 스마트 HTTP를 사용합니다. 스마트 교환에 실패하면 clone 및 fetch는 덤(dumb) HTTP로 대체됩니다. SSH는 ssh2 확장이 로드되어 있으면 이를 사용하고, 그렇지 않으면 시스템 ssh 바이너리를 사용합니다.
예. Pitmaster::init()의 두 번째 인수로 'sha256'을 전달하거나 --object-format=sha256 옵션으로 init을 실행하세요. 그러면 객체에 64자 해시를 사용합니다.
아니요. log, status, diff, commit, merge, blame 및 grep 등 git 명령의 일부를 구현합니다. clone, fetch 및 push는 PHP API을 통해서만 사용할 수 있습니다.
시작하기 가이드에 따라 PHP에서 첫 저장소를 여세요. 나머지 내용은 API 및 CLI 참고 자료에서 확인할 수 있습니다.