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) usante root para a parte inicial da configuração.
Crie o(a) usante e grupo git e
configure um resumo de senha desusá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-se um resumo de senha desusável (substituindo-se o
! por NP) destrava 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 lar do(a) usante 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, anteponha algumas opções para evitar que os(as) usantes
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 <user-ssh-key> >> /home/git/.ssh/authorized_keys
Também é útil configurar o nome padrão da ramificação inicial de
novos repositórios modificando a configuração do git. Como o(a)
usante root, execute:
git config --system init.defaultBranch trunk
Finalmente, adicione a entrada /usr/bin/git-shell ao arquivo de configuração
/etc/shells. Esse shell foi
configurado no perfil do(a) usante 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) usante git tenha acesso de
leitura/escrita a esse local. Nós usamos /srv/git como diretório base. Crie um novo
repositório git com os seguintes
comandos (como o(a) usante 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) usante, 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) usante for importada para o arquivo
authorized_keys do git, o(a) usante
conseguirá 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-20251204:
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.