Esta seção descreverá como configurar, administrar e proteger um servidor git. Git tem muitas opções disponíveis. Para documentação mais detalhada, veja-se https://git-scm.com/book/en/v2.
As instruções a seguir instalarão um servidor git. Ele será configurado para usar OpenSSH como método de acesso remoto seguro.
A configuração do servidor consiste nas seguintes etapas:
Você precisará ser o(a) usuário(a) root
para a parte inicial da configuração.
Crie o(a) usuário(a) e grupo git
e defina um resumo de senha inutilizável com os seguintes
comandos:
groupadd -g 58 git && useradd -c "Proprietário(a) do git" -d /home/git -m -g git -s /usr/bin/git-shell -u 58 git && sed -i '/^git:/s/^git:[^:]:/git:NP:/' /etc/shadow
Colocar um resumo de senha inutilizável (substituindo
!
por NP
) desbloqueia a conta, mas ela não pode ser
usada para se conectar via autenticação de senha. Isso é exigido
pelo sshd para funcionar
corretamente. Em seguida, crie alguns arquivos e diretórios no
diretório "home" do(a) usuário(a) git, permitindo acesso ao
repositório "git" usando chaves "ssh".
install -o git -g git -dm0700 /home/git/.ssh && install -o git -g git -m0600 /dev/null /home/git/.ssh/authorized_keys
Para qualquer desenvolvedor(a) que devesse ter acesso ao
repositório, adicione a chave pública "ssh" dele/dela em
/home/git/.ssh/authorized_keys
.
Primeiro, acrescente algumas opções para evitar que os(as)
usuários(as) usem a conexão com o "git" para encaminhamento de
porta para outras máquinas que o servidor "git" possa alcançar.
echo -n "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty " >> /home/git/.ssh/authorized_keys && cat <chave-ssh-usuário(a)> >> /home/git/.ssh/authorized_keys
Também é útil definir o nome padrão da ramificação inicial de
novos repositórios modificando a configuração do "git". Como o(a)
usuário(a) root
, execute:
git config --system init.defaultBranch trunk
Por fim, adicione a entrada /usr/bin/git-shell
ao arquivo de configuração
/etc/shells
. Esse shell foi
definido no perfil do(a) usuário(a) git
e serve para garantir que somente ações
relacionadas ao "git" possam ser executadas:
echo "/usr/bin/git-shell" >> /etc/shells
O repositório pode estar em qualquer lugar no sistema de
arquivos. É importante que o(a) usuário(a) "git" tenha acesso de
leitura/escrita a esse local. Usamos /srv/git
como diretório base. Crie um novo
repositório git com os seguintes
comandos (como o(a) usuário(a) root
):
Em todas as instruções abaixo, usamos projeto1 como um nome de repositório de exemplo. Você deveria nomear seu repositório como um nome descritivo curto para seu projeto específico.
install -o git -g git -m755 -d /srv/git/projeto1.git && cd /srv/git/projeto1.git && git init --bare && chown -R git:git .
Todas as instruções nesta seção e na próxima deveriam ser feitas em um sistema do(a) usuário(a), não no sistema do servidor.
Agora que o repositório foi criado, ele pode ser usado pelos(as)
desenvolvedores(as) para colocar alguns arquivos nele. Depois que
a chave "ssh" do(a) usuário(a) for importada para o arquivo
authorized_keys
do "git", o(a)
usuário(a) poderá interagir com o repositório.
Uma configuração mínima deveria estar disponível no sistema do(a) desenvolvedor(a) especificando o nome de usuário(a) e endereço de correio eletrônico dele(a). Crie esse arquivo de configuração mínima no lado do cliente:
cat > ~/.gitconfig <<EOF [user] name = <nome-usuário(a)> email = <endereço-correio-eletrônico-usuário(a)> EOF
Na máquina do(a) desenvolvedor(a), configure alguns arquivos para serem enviados ao repositório como conteúdo inicial:
O termo gitserver usado abaixo deveria ser o nome do dispositivo (ou endereço "IP") do servidor "git".
mkdir meuprojeto cd meuprojeto git init --initial-branch=trunk git remote add origin git@gitserver:/srv/git/projeto1.git cat >LEIAME <<EOF Este é o arquivo 'LEIAME' EOF git add LEIAME git commit -m 'Criação inicial do LEIAME' git push --set-upstream origin trunk
O conteúdo inicial agora é enviado ao servidor e fica disponível
para outros(as) usuários(as). Na máquina atual, o argumento
--set-upstream origin trunk
agora
não é mais necessário, pois o repositório local agora está
conectado ao repositório remoto. Envios subsequentes podem ser
realizados como
git push
Outros(as) desenvolvedores(as) agora podem clonar o repositório e fazer modificações no conteúdo (desde que as chaves "ssh" deles(as) tenham sido instaladas):
git clone git@gitserver:/srv/git/projeto1.git cd projeto1 vi LEIAME git commit -am 'Correção para o arquivo LEIAME' git push
Essa é uma configuração de servidor muito básica baseada no
acesso OpenSSH. Todos(as)
os(as) desenvolvedores(as) estão usando o(a) usuário(a)
git
para realizar ações no
repositório e as mudanças que os(as) usuários(as) estão
"comitando" podem ser distinguidas como o nome de usuário(a)
local (veja-se ~/.gitconfig
)
sendo registrado nos conjuntos de mudanças.
O acesso é restrito pelas chaves públicas adicionadas ao arquivo
authorized_keys
do "git" e não
existe opção para o público exportar/clonar o repositório. Para
habilitar isso, continue com a etapa quatro (4) para configurar o
servidor "git" para acesso público somente leitura.
Na "URL" usada para clonar o projeto, o caminho absoluto (aqui
/srv/git/projeto1.git
) tem de ser
especificado, pois o repositório não está no diretório "home" do
"git", mas em /srv/git
. Para
eliminar a necessidade de expor a estrutura de instalação do
servidor, um link simbólico pode ser adicionado no diretório
"home" do "git" para cada projeto, como isto:
ln -svf /srv/git/projeto1.git /home/git/
Agora, o repositório pode ser clonado usando
git clone git@gitserver:projeto1.git
A configuração descrita acima torna um repositório disponível para usuários(as) autenticados(as) (via fornecimento do arquivo de chave pública "ssh"). Também existe uma maneira simples de publicar o repositório para usuários(as) não autenticados(as) — certamente, sem acesso de escrita.
A combinação do acesso via "ssh" (para usuários(as) autenticados(as)) e a exportação de repositórios para usuários(as) não autenticados(as) via processo de segundo plano é, na maioria dos casos, suficiente para um sítio de desenvolvimento.
O processo de segundo plano estará alcançável na porta
9418
por padrão. Certifique-se de
que a configuração do seu "firewall" permite acesso a essa
porta.
Para iniciar o servidor em tempo de inicialização, instale a
unidade git-daemon.service
a partir
do pacote blfs-systemd-units-20220720:
make install-git-daemon
Para a finalidade de permitir que o git exporte um repositório, um arquivo
chamado git-daemon-export-ok
é
necessário em cada diretório de repositório no servidor. O
arquivo não necessita de conteúdo; apenas a existência dele
habilita; a ausência dele desabilita a exportação daquele
repositório.
touch /srv/git/projeto1.git/git-daemon-export-ok
Junto com a unidade git-daemon.service
, um arquivo de configuração
chamado /etc/default/git-daemon
foi
instalado. Revise esse arquivo de configuração para corresponder
às suas necessidades.
Existem somente três opções a configurar no arquivo de configuração:
GIT_BASE_DIR=<nome-diretório>
Especifique o local dos repositórios "git". Os caminhos relativos usados ao acessar o processo de segundo plano serão traduzidos relativos a esse diretório.
DFT_REPO_DIR=<nome-diretório>
Esse diretório é adicionado à lista branca de diretórios
permitidos. Essa variável pode conter vários nomes de
diretório, mas geralmente é definida igual a GIT_BASE_DIR
.
GIT_DAEMON_OPTS=<opções>
No caso de opções especiais para o comando git daemon serem
necessárias, elas tem de ser especificadas nessa
configuração. Um exemplo pode ser ajustar o número da porta
onde o processo de segundo plano está escutando. Nesse
caso, adicione --port=<número da
porta>
a essa variável. Para mais informações
relativas a quais opções podem ser definidas, dê uma olhada
na saída gerada de git daemon
--help.
Após iniciar o processo de segundo plano, usuários(as) não autenticados(as) conseguem clonar repositórios exportados usando
git clone git://gitserver/projeto1.git
Como o diretório base é /srv/git
por padrão (ou definido como um valor personalizado na
configuração), git interpreta o
caminho de entrada (/projeto1.git) relativo a esse diretório
base, de modo que o repositório em /srv/git/projeto1.git
seja servido.