Eu tenho um repositório Git em um servidor intermediário para o qual vários desenvolvedores precisam ser capazes de acessar. git-init
parece ter uma bandeira muito próxima do que estou procurando: --shared
exceto que eu gostaria que várias pessoas puxassem para esse repositório também. O git-clone
's --shared
flag faz algo totalmente diferente.
Qual é a maneira mais fácil de alterar as permissões de um repositório existente?
permissions
git
users
share
Andrey Fedorov
fonte
fonte
Respostas:
Permissões são uma praga.
Basicamente, você precisa garantir que todos esses desenvolvedores possam gravar em tudo no repositório git.
Vá para The New-Wave Solution para obter o método superior de conceder a um grupo de desenvolvedores a capacidade de gravação.
A solução padrão
Se você colocar todos os desenvolvedores em um grupo especialmente criado, poderá, em princípio, apenas:
Em seguida, altere
umask
para os usuários para002
que novos arquivos sejam criados com permissões graváveis em grupo.Os problemas com isso são legião; se você estiver em uma distribuição que assume uma parte
umask
de022
(como ter umusers
grupo comum que inclua todos por padrão), isso pode abrir problemas de segurança em outro local. E mais cedo ou mais tarde, algo vai estragar seu esquema de permissões cuidadosamente criado, colocando o repositório fora de ação até você obterroot
acesso e corrigi-lo (ou seja, reexecutar os comandos acima).A solução New-Wave
Uma solução superior - embora menos compreendida e que exija um pouco mais de suporte do SO / ferramenta - é usar atributos estendidos do POSIX. Eu só vim para essa área recentemente, então meu conhecimento aqui não é tão quente quanto poderia ser. Mas, basicamente, uma ACL estendida é a capacidade de definir permissões em mais do que apenas os 3 slots padrão (usuário / grupo / outro).
Então, mais uma vez, crie seu grupo e execute:
Isso configura a ACL estendida para o grupo, para que os membros do grupo possam ler / gravar / acessar qualquer arquivo que já esteja lá (a primeira linha); informe também a todos os diretórios existentes que novos arquivos devem ter a mesma ACL aplicada (a segunda linha).
Espero que você esteja no seu caminho.
fonte
chmod -R g+swX
isso, deixou o Git muito infeliz e decidiu que não era mais um repositório git ("repo não parece ser um repositório git"). Eu tive que chmod gs todos os arquivos . Para definir apenas o bit setgid nos diretórios , tentefind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Ainda faça ochgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
aplicará o bit setguid aos arquivos, o que é um risco à segurança. Em vez disso, você podefind . -type d -exec chmod g+s {} +
aplicá-lo apenas a diretórios.se você criou o repositório (ou clonou um novo repositório vazio de um existente) com
ou
O Git deve manipular permissões acima e além do que o umask padrão fornece. Finalmente, isso é verdade na minha versão do Git (1.6.3). Obviamente, isso pressupõe que seus usuários estão no mesmo grupo.
No entanto, se eu precisasse gerenciar usuários em vários grupos com diferentes graus de leitura / gravação, eu usaria gitosis. Também ouvi menção ao gitolite ( http://github.com/sitaramc/gitolite ), um garfo de gitose que deve fornecer permissões em nível de ramificação, mas não posso dizer que já o usei pessoalmente.
fonte
--shared
argumento recebe um octal, não hexadecimal. Eu confirmei isso na fonte do Git 1.7.8 e o segundo exemplo deve sergit init --shared=0NNN
.NNN
- máscara de permissão ou número de grupo ou outra coisa?git init --bare --shared=group myproj
repositório , é onde myproj é o nome do seu repositório, seguido dechgrp -R mygroup myproj
onde mygroup é o nome do seu grupo.Isso não foi dito, então eu quero adicioná-lo rapidamente.
Para garantir que os problemas de permissão não cortem sua cabeça feia, defina o seguinte no arquivo de configuração do seu repositório compartilhado git:
Isso garantirá que as configurações "umask" do seu sistema sejam respeitadas.
fonte
git config core.sharedRepository true
.git init --shared
égit clone --config core.sharedRepository=true
. Estranho de git usar--shared
para significados tão diferentes em comandos semelhantes.O Manual do Usuário do Git descreve como compartilhar um repositório de várias maneiras.
Mais complicadas, embora as maneiras completas de compartilhar repositórios sejam:
Usamos o GitHub para uma equipe de 6 desenvolvedores.
fonte
Veja também o gitolite para hospedar seu repositório git. Aparentemente, a gitose não está mais sendo desenvolvida.
fonte
Uma maneira de corrigir permissões no repositório compartilhado, para que os usuários não tenham problemas de permissão ao enviar, é criar um script de gancho pós-atualização que faça exatamente isso. Isso deve funcionar em qualquer versão do git.
Suponha que você tenha um repositório compartilhado em /myrepo.git. Todos os arquivos desse repositório pertencem ao mysharedgroup . Todos os usuários que enviam para esse repositório também devem pertencer ao mysharedgroup . Agora crie o seguinte arquivo (alterando o mysharedgroup para suas preferências):
/myrepo.git/hooks/post-update
fonte
/dev/null
. Deixe o usuário ver essas mensagens primeiro e depois decidir por conta própria.Para agregar os pequenos conselhos de várias outras respostas e comentários sobre a criação de um novo repositório:
Se você estiver configurando um novo repo marca
myrepo
no/srv/git
para o grupomygroup
, este é o que você quer:mygroup
core.bare = true
: torná-lo um repositório simplescore.sharedrepository = 1
(o mesmo quecore.sharedrepository = group
): o diretório repo e todos os diretórios criados posteriormente serão gerenciados pelo git para permitir permissões demygroup
leitura, gravação e execução (com o bit sgid definido também - para trabalhar com usuários para os quaismygroup
não é seu grupo primário)receive.denyNonFastforwards = 1
: negar impulsos não rápidos para o repositórioSe você deseja ajustar as permissões de usuário, grupo ou de outros usuários, use
--shared=0NNN
, ondeNNN
estão o usuário, grupo e outros bits padrão para arquivos (os bits execute e sgid nos diretórios serão gerenciados adequadamente pelo git). Por exemplo, isso permite acesso de leitura e gravação ao usuário e acesso somente leitura ao grupo (e nenhum acesso a outro):Isso permite acesso de leitura e gravação ao usuário e grupo (e nenhum acesso a outros):
Isso permite acesso de leitura e gravação ao usuário e grupo e acesso somente leitura a outros:
Observe que, se você não permitir o acesso de gravação ao grupo, use primeiro
chown
para definir o proprietário do repositório e execute ogit init
comando como esse usuário (para garantir que o repositório seja inicializado com o proprietário correto para todos os arquivos e subdiretórios iniciais).fonte
Você pode usar o git-daemon para compartilhar o repositório. Leia a documentação do git-daemon para obter mais informações.
EDITAR:
Verifique também este artigo 8 maneiras de compartilhar seu repositório git .
fonte
Fazer exatamente isso funcionou para mim, para um repositório existente. Isso requer conselhos de várias respostas e comentários antes:
No diretório pai do repositório, no servidor:
fonte
@stevek_mcc resposta é a que eu estava procurando quando pesquisei esta pergunta no Google
fonte