Git – Gitosis – Ubuntu

Olá!

Seguindo o tutorial que encontrei no Dito.blog, conseguí utilizar o gitosis para gerenciar meus repositórios git! Encontrei alguns problemas que o tutorial não pôde me responder, então vou escrever aqui a minha experiência, os problemas que encontrei e as soluções que adotei.

Vamos lá.

Em primeiro lugar você terá que decidir qual vai ser a máquina que vai conter o repositório principal – Sim, eu seu que estamos falando de git e, de acordo com a filosofia do versionamento distribuído, não existe um repositório principal (que cheira a versionamento centralizado). Mas todos nós (mesmo os mais chiitas) havemos de concordar que é necessário, ao menos, termos um repositório X de onde pegar as coisas pra enviar pro ambiente de testes e, posteriormente, produção. Dessa forma, pra eu não ser masscrado, (se é que alguém vai, um dia, ler isto aqui) vamos trocar o nome de repositório central para repositório de validação (eu o chamei assim pra não ficar repositório de testes, o que daria uma conotação um pouco estranha… de qualquer forma eu quis dizer que este é o dito repositório que vai servir o ambiente de testes… chame-o do que quiser!) .

Para facilitar:

  • servpc = Máquina que vai ter o repositório de validação
  • seupc = O seu pc! – A máquina do desenvolvedor que vai acessar o repositório central de validação.

Mãos à obra!

No servidor do repositório central servpc:

Suponho que você já tenha o git instalado 😉

Se não tem, instale!

sudo apt-get install git-core

Agora instale o servidor ssh no servpc:

Você pode usar o gerenciador de pacotes ou ir ao terminal e digitar

sudo apt-get install openssh-server openssh-client openssh-blacklist

Agora vamos instalar o gitosis.

Se você já tem uma pasta sources, ótimo; se não tem, crie uma! Depois entre nela…

mkdir ~/sources

cd ~/sources

Agora faça o clone do source do gitosis:

git clone git://eagain.net/gitosis.git

cd gitosis

O gitosis é escrito em python, então precisaremos desse cidadão pra executarmos a instação:

sudo apt-get install python-setuptools

Agora sim, podemos instalar o gitosis:

sudo python setup.py install

Ótimo, agora precisaremos criar um usuário (não se esqueça que ainda estamos no servpc, ok?) para acessarmos os repositórios via ssh. Copie e cole o código a seguir (assim como está) no terminal e pressione enter:

sudo adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git

A saída deve ser pacecida com essa:

Adicionando usuário de sistema `git' (UID XXX) ...
Adicionando novo grupo `git' (GID XXX) ...
Adicionando novo usuário `git' (UID XXX) ao grupo `git' ...
Criando diretório pessoal `/home/git' ...

Aqui entra um detalhe que não encontrei nos tutoriais que seguí (e isto é o que me levou a escrever este post): Não me pergunte o motivo mas, no ubuntu, mesmo ao criar um usuário utilizando o parâmetro –disabled-password, ao tentar fazer uma conexão utilizando ssh, o terminal pede a entrada da senha. Logo, se não tivermos uma senha definida, não conseguiremos efetuar a conexão. Então vamos definir uma senha para o usuário git:

sudo passwd git

Entre com uma senha de sua preferência, confirme… e não se esqueça dela!

Muito bem, vamos para o pc do desenvolvedor!

No seupc:

Crie uma uma chave RSA para o seu usuário, dessa forma:

ssh-keygen -t rsa

Repare que foi criada uma pasta .ssh na sua home (o comando ls -a | grep ssh vai te ajudar a reparar isso).

Agora será necessário exportar a sua chave pública para o servpc, dessa forma:

scp ~/.ssh/id_rsa.pub git@servpc:/home/git/

Se ele perguntar alguma coisa responda yes. Depois entre com a senha que você definiu para o usuário git e pronto.

Agora volte ao servpc…

No servpc:

Inicie o gitosis, dessa forma:

sudo -H -u git gitosis-init < /home/git/id_rsa.pub&#91;/sourcecode&#93;
O resultado deverá ser o seguinte
&#91;sourcecode language='html'&#93;Initialized empty Git repository in ./
Initialized empty Git repository in ./&#91;/sourcecode&#93;
Precisaremos alterar as permissões do arquivo post_update, portanto executaremos o seguinte comando:
&#91;sourcecode language='html'&#93;sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update&#91;/sourcecode&#93;
Excelente! A configuração do gitosis está pronta, já podemos criar o nosso projeto!
<h3><strong><em>No </em></strong>seupc<strong><em>:</em></strong></h3>
Bom, vamos clonar o projeto gitosis-admin (que, por sinal, é um repositório git também) para a sua máquina, dessa forma:
git clone git@servpc:gitosis-admin.git

cd gitosis-admin

Edite o arquivo gitosis.conf com o gedit (gedit gitosis.conf) e adicione as linhas do seu projeto:

[group seu_time]
writable = nome_projeto
members = seu_usuario@seupc

Dê um commit nesta alteração e envie isto ao repositório no servpc:

git commit -a -m "Criacao do projeto nome_projeto"

git push

Perfeito! Agora você vai criar o novo projeto normalmente na pasta que você preferir. Eu crio os meus em ~/projects/

mkdir nome_projeto

cd nome_projeto

git init

touch README

git add .

git add README

git remote add origin git@servpc:nome_projeto.git

git commit -a -m "Iniciando o projeto..."

git push origin master:refs/heads/master

Prontinho amigão, agora seu repositório está funcionando perefeitamente.

Para adicionar novos usuários você vai precisar copiar as chaves públicas deles para a pasta keydir do repositório gitosis-admin, adicionr os nomes dos usuários no item members do arquivo gitosis.conf (separando por espaçoes), commitar essas alterações e dar um push nisso tudo!

Por exemplo, você quer que o João tenha acesso ao repositório que acamos de criar. Então copie o arquivo id_rsa.pub dele (que você já sabe como criar) para o diretório …/gitosis-admin/keydir/ . Mas ao copiar, renomeie o nome do arquivo para este padrão: nomeUsuario@nomeMaquina – Exatamente o que aparece no começo da linha do terminal. Aqui, por exemplo, quando abro o terminal me aparece o seguinte filipe@filipenote:~\ $.

cd ~/gitosis-admin

cp ~/joao@joaopc.pub keydir/

git add keydir/joao@joaopc.pub

Altere o arquivo gitosis.conf dessa forma:

[group seu_time]
writable = nome_projeto
members = seu_usuario@seupc joao@joaopc

Agora adicione, comite e dê um push nessas alterações.

git add gitosis.conf

git commit -a -m "Inserindo acesso ao joao para o projeto"

git push origin master:refs/heads/master

Problemas pós-operatórios…

Agora vem um problemão que tive após criar o meu primeiro repositório…

Depois de criar o repositório, não conseguí mais dar push no repositório gitosis-admin, o que me impossibilitava de adicionar novos usuário e etc…

A princípio, a soluçào que encontrei pra isso foi logar como root no servpc, dar um git clone no repositório usando seu caminho literal (/home/git/repositories/gitosis-admin.git) e fazer as alterações nesse contexto.

Funcionou… mas nào me satisfiz com isso… então resolvi testar executar o comando sudo -H -u git gitosis-init < /home/git/id_rsa.pub novamente e… deu certo!

Bom, na verdade eu precisei reescrever o arquivo gitosis.conf, mas depois disso, tudo ficou normal!

É isso aí… espero que tenha conseguido ajudar alguém com problemas parecidos.

Um abraço!

5 comentários sobre “Git – Gitosis – Ubuntu

  1. cliff oliveira disse:

    estou com uma dúvida:
    cliff@cliff-laptop:~/sources/gitosis$ sudo -H -u git gitosis-init < /home/cliff/git/id_rsa.pub

    bash: /home/cliff/git/id_rsa.pub: Arquivo ou diretório inexistente
    como buscar aonde está o arquivopara iniciar o gitosis ?

  2. filipechagas disse:

    Olá Cliff, você copiou o seu id_rsa.pub pra lá?

    (…)
    Agora será necessário exportar a sua chave pública para o servpc, dessa forma:

    scp ~/.ssh/id_rsa.pub git@servpc:/home/git/

    Se ele perguntar(…)

  3. Vinicius disse:

    Cara, segui um tutorial em inglês, e consegui configurar tudo certo. Adicionei novos usuários no projeto e está funcionando perfeitamente.

    O problema veio agora, ao tentar entrar no ssh com o root

    ssh root@ip

    Ele retorna a seguinte informação:

    PTY allocation request failed on channel 0
    ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
    
    Connection to 111.111.111.111 closed.
    

    Até agora não consegui identificar como resolver. Se tiver alguma luz, agradeço 🙂

Deixar mensagem para Danilo Cancelar resposta