Configure permissões

4

Estou compartilhando um repositório git com um amigo pelo SSH. Ele empurra e puxa para seu repositório git usando o servidor SSH da minha máquina, onde o repositório git compartilhado é.

O problema é que quando ele envia um commit, não consigo puxar, porque o commit é janito users rwx------ (esses são metadados de permissão).

Eu criei um grupo chamado git, adicionei ele e eu mesmo, e o repositório é jpmelos git rwxrwx--- . Como posso forçar arquivos criados no diretório de repositório para serem <creator> git rwxrwx--- , para que possamos sempre puxar e empurrar sem nos preocuparmos com permissões?

Ou você pode sugerir soluções melhores para o problema, é claro. Restrições são que precisamos usar o SSH na minha máquina (ainda não estamos prontos para tornar o código público) e já estamos empurrando e puxando de um repositório vazio que eu criei separadamente do meu repositório de trabalho.

Obrigado!

    
por jpmelos 19.11.2011 / 16:35

5 respostas

2

Os problemas de umask podem ser atendidos com a variável de configuração core.sharedRepository Git:

( cd /path/to/shared-repository.git &&
git config --bool core.sharedRepository true
)

Sempre que o Git criar um novo arquivo ou diretório, ele se certificará de que os bits do grupo estejam configurados adequadamente (sempre legível, grupo, gravável e executável quando apropriado - mesmo se umask do usuário for excessivamente ampla). Nota: A configuração core.sharedRepository aplica-se apenas às entradas feitas pelo próprio Git, portanto não ajudará a definir as permissões das entradas na árvore de trabalho de um repositório não-nu. Você terá que definir sua umask manualmente para isso.

Você pode fazer com que novos arquivos e diretórios sejam de propriedade de grupo do seu grupo git , definindo o bit setgid nos diretórios (depois de chgrp o arquivo e diretórios para o grupo apropriado).

chgrp -R git /path/to/shared-repository.git &&
find /path/to/shared-repository.git -type d -exec chmod g=rwxs '{}' \;

Se você estiver criando um novo repositório do zero, você pode apenas chgrp um diretório vazio e executar git init --shared nele (o Git definirá core.sharedRepository e fará o chmod g=rwxs no GIT_DIR):

mkdir new-shared.git &&
chgrp git new-shared.git &&
git init --bare --shared new-shared.git
    
por 20.11.2011 / 10:21
0

Qual é o cenário de umask de seu amigo? Peça-lhe que digite umask em seu prompt de comando no seu servidor e veja o que aparece. Se ele ler 0077 (ou 077 ), é provável que o problema, porque isso significa "ao criar arquivos, limpe todos os bits de permissão para grupo ou outro".

Um umask mais apropriado seria 0027 , o que permitirá a permissão de leitura e execução de grupos em arquivos criados. Ele pode definir isso temporariamente executando umask 0027 ou permanentemente, adicionando-o ao seu ~/.profile ou ~/.bash_profile .

    
por 19.11.2011 / 20:43
0

Eu acho que isso poderia ser feito escrevendo um script personalizado como um gancho do Git - qualquer linguagem de script fará tanto quanto todos clonando o repositório do Git puderem usá-lo. Leia sobre os ganchos do Git no Pro Git.

    
por 20.11.2011 / 01:19
0

Você provavelmente deve conferir gitosis .

Nesse sistema, uma conta git especial é criada para hospedar todos os seus repositórios. Como admin da gitosis, basta adicionar as chaves públicas do ssh dos seus usuários para conceder acesso. Seus git urls acabam ficando assim:

ssh: //git@myserver/my-repo.git

Todos os usuários se conectam usando a conta do usuário git, mas ela é segura porque o acesso ao shell não é permitido. Em vez disso, todo o acesso é forçado a passar por uma gitosis que pode regular e proteger o acesso a repositórios git individuais de uma forma configurável. E o seu problema de permissão não aparece porque apenas o usuário git nunca interage com o sistema de arquivos.

    
por 20.11.2011 / 07:30
0

Outras coisas a considerar:

pam_umask

Para usar pam para controlar umask, tenha UsePAM yes em sshd_config e isso em /etc/pam.d/sshd :

session    optional     pam_umask.so umask=0027

acls

Leia as postagem de Gilles aqui . Inclui instruções de instalação. Eu não sei se é uma dúvida, mas vale a pena ler esta página :-)

Para corrigir acls no seu repositório já existente:

find git_repository/ -type d -exec setfacl -m d:g:git:rwx {}
find git_repository/ -f -exec setfacl -m g:git:rwx {}

rápido e sujo: gancho

Crie um hook como mencionado anteriormente, edite git_repository/hooks/post-update como:

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R git . 2>/dev/null

Isso consertará as coisas após cada atualização e provavelmente será bom para um pequeno repositório e dois usuários. Provavelmente não para repositórios maiores e ocupados; -)

    
por 20.11.2011 / 12:03