Executando verificação de segurança...
14

Eu construi um mini-github

Mini github

Olá, neste post irei contar sobre como construi um mini-github utilzando laravel.

Disclaimer: não sou especialista, o post traz opniões MINHAS, nem tudo tem base técnica, o post é para contar uma experiência, não um documento técnico ;D

A ideia

Bom, lá estava eu procrastinando um pouco em meu pc, até que tive a curiosidade de: como o github ou o gitlab funcionam? inicialmente enviei alguns git push a um webhook, para ver o que ele mandava. E era interessantemente inutil, nenhum corpo, alguns cabeçalhos. Bom, ai acabei arregando para o chatgpt :P, e ele não me devolveu nada de interessante(literalmente nada), então fui na doc do git, e depois de ler um pouco, pronto! descobri que para tal feito precisava configurar o git-http-backend(porque não ssh? Ninguém usa isso :D).

A jornada do git-http-backend

Bom, o git-http-backend recebe as informações via CGI, simples né? só que não, pelo menos para mim que não tinha mto experiência configurando servidores, tinha 3 opções para implementar isto:

  • Programar uma comunicação cgi pelo php
  • Configurar um servidor apache
  • Configurar um nginx

CGI pelo PHP

Bom, a primeira opção que tentei foi o cgi pelo php, e por incrivel que pareça não tem quase nada na internet sobre isto, tirando o Pacote do TuzelKo, porém a implementação dele não é muito customizavel, então por que não adaptar? ninguém curte o proc_open e levaria mais tempo :P.

Configurar o apache

Então, neste daqui não perdi muito tempo, não manjo nada de apache, mais é a opção com mais exemplos na internet.

Configurar nginx

Bom, está foi a solução escolhida até agora(ainda sonho com o PHP cgi), eu implementei ela utilizando docker, que por sorte tinha uma imagem pronta. E com alguns volumes e horas de luta com o meu windows(não use windows), tinha um servidor http de repositorios git.

Interface

Para construir a interface(parte mais divertida), utilizei a TALL stack, junto com o Preline, para poder interagir com os repositorios utilizei o git-php, está parte não tem muito misterio, é básicamente o seguinte: da o comando para pegar as informações, trata elas e joga na tela.

OBS: os repositorios que são armazenados no servidor são repositorios bare, que não armazenam nenhum arquivo, além dos arquivos de configuração do git

Exemplo de comandos

Montar arvore de objetos(simplificada):

$tree = $repo->execute(
    'ls-tree', "--format='%(objectmode) %(objecttype) %(objectname) %(path)",
    'HEAD',
);

$objects = [];
foreach ($tree as $object) {
    $data = explode(' ', $object);

    $lastCommit = explode(
        '-separator-',
        $repo->execute(
            'log',
            '--find-object=' . $data[2],
            "--pretty=format:'%ad-separator-%s'",
            '--date=short'
        )[0]
    );

    $objects[] = [
        'type' => $data[1],
        'full_name' => $data[3],
        'name' => str_replace($this->tree . '/', '', $data[3]),
        'last_commit' => [
            'date' => $lastCommit[0],
            'description' => $lastCommit[1]
        ]
    ];
}

Como exibir um arquivo/blob:

$repositoryPath = storage_path('repositories/' . $this->repository->title . '.git');

$gitCommand = 'git show HEAD:' . $this->blobName;
$blobContent = shell_exec("cd $repositoryPath && $gitCommand");

Conclusão

Aprendi muito sobre git :D

Carregando publicação patrocinada...
3

Parabéns, diegohenrique, pelo seu esforço em construir "um mini GitHub"! A expressão "mini-GitHub" é um pouco equivocada, pois o seu projeto é, essencialmente, uma interface web que facilita a interação com repositórios Git. É interessante notar que o Git possui uma implementação web nativa, o webgit, além do cgit. A abordagem de criar e hospedar repositórios Git na web usando essas ferramentas era bastante popular antes da ascensão do GitHub, com projetos hospedando seus próprios repositórios em subdomínios como git.domain.com. Projetos como o suckless (https://git.suckless.org/) ainda mantêm essa tradição. A interface webgit padrão merece, de fato, mais reconhecimento, embora existam alternativas self-hosted muito mais modernas, como o Gitea.

Quanto à dificuldade em encontrar informações relacionadas ao PHP para esse tipo de projeto, posso assegurar que talvez você esteja procurando nos lugares errados. Antes do GitHub, essa prática era muito comum, então é possível encontrar recursos relevantes em locais como o SourceForge ou até mesmo em pacotes de distribuições Linux antigas. Além disso, a ferramenta de busca do Google oferece a opção de pesquisar por conteúdos de épocas específicas. Experimente buscar informações como se estivesse nos meados dos anos 2000, isso pode revelar fontes valiosas que foram populares antes do GitHub dominar o cenário.

Novamente, parabéns pela iniciativa e pelo aprendizado adquirido! Seu projeto é um ótimo exemplo de como explorar e entender tecnologias fundamentais pode ser uma jornada enriquecedora. Disse isso outro dia aqui: aprender verdadeiramente o Git é uma das coisas mais simples que você pode fazer para construir um verdadeiro diferencial em seus conhecimentos!

2

Mini-github seria equivocado talvez, mais é o jeito mais facil e chamativo de se referir, é um projeto de portfolio. Mais sobre o PHP, realmente, não fiz uma pesquisa profunda e li o código fonte do pacote que citei. trabalhar com a cli do git me incomoda um pouco, mas acho que a implementação ficou boa para 5 dias. Minha intenção é só compartilhar a experiência :D, e sinta-se a vontade para mandar links aqui que possam melhorar o projeto.

2
1

Esse caminho é muito legal, eu já estudei muitono git, do mesmo jeito que você fez. Hoje uso os git hooks pra criar paginas html estaticas, uso shell scripts que são executados no computador remoto. A solução acredito ser muito simples. Recomendo continuar estudando: veja o protocolo git, o formato packfile e a libgit2. Isso vai te fazer entender como o git funciona. Boa sorte nessa jornada.

0

Parei no "ninguém usa SSH com git".

Amiguinho, de acordo com a Microsoft, 79% dos usuários do GitHub usam o Git com SSH!

Só novato que usa HTTPS com git. Além de mais lento é mais inseguro.

2
1