Eu tenho um repositório git existente (um simples) que até agora só podia ser escrito por mim. Quero abri-lo para algum grupo de usuários do UNIX, foo, para que todos os membros de foo possam enviar por push. Estou ciente de que posso configurar facilmente um novo repositório git com:
git init --bare --shared=group repodir
chgrp -R foo repodir
Mas preciso da operação equivalente para um diretório de repositório existente .
git
permissions
share
shared
Pistos
fonte
fonte
Respostas:
Tente isso para fazer um repositório existente
repodir
funcionar para usuários no grupofoo
:fonte
git init --shared
comando em um repo existente para definir o valor de configuração. Você também precisachmod
executar o comando para obter as permissões dos arquivos corretas.git pull
etc. como root em vez de comowww-data
ou o que quer que seja o proprietário e, como resultado, você obtémerror: insufficient permission for adding an object to repository database .git/objects
. Achei que tivesse corrigido a propriedade de todos os arquivos / diretórios que estavam errados usandofind
e-type d
/type -f
, mas apenas esse método eliminou o erro (provavelmente porque um arquivo em algum subdiretório não era gravável em grupo?)core.sharedRepository
mencionaria isso - parece inútil sem os usuários tornando todos os seus grupos de arquivos graváveis.No dir repo, execute os seguintes comandos:
Editar: para resolver a confusão frequente,
group
é uma palavra-chave real, você não deve substituí-la pelo nome do grupo.fonte
group
NÃO está o nome do grupo :)git config core.sharedRepository dev
em seguida, digitandogit config
eu chegarfatal: bad config value for 'core.sharedrepository' in .git/config
emgit version
1.7.0.4
(e possivelmente versões depois)git config core.sharedRepository group
group
não é o nome do grupo, mas o valor real!Mesclando as respostas @David Underhill e @kixorz , fiz minha própria solução (definitiva).
É para repositórios básicos e não básicos. Existem apenas pequenas diferenças entre eles, mas desta forma é mais clara.
BARE REPOSITORY
Onde:
<repo.git>
é o diretório do repositório vazio, normalmente no servidor (por exemplomy_project.git/
).<group-name>
é o nome do grupo para usuários git (por exemplo, usuários ).REPOSITÓRIO NON-BARE
Onde:
<project_dir>
é o diretório do projeto que contém a.git
pasta.<group-name>
é o nome do grupo para usuários git (por exemplo, usuários ).fonte
chmod g-w objects/pack/*
(se for um repositório não.git/
find . -type d
' gera um errounable to execute /bin/chmod: Argument list too long
chmod g+s `find . -type d`
não é escalonável. Usofind -type d -exec chmod g+s {} +
chmod g-w objects/*/*
. Não tenho certeza sobre o subdiretório info, pois está vazio para este repositório.Isso provavelmente não é necessário, mas vale a pena ressaltar que
git init --bare --shared
também define a opção denyNonFastForwards .O significado desta opção é o seguinte:
(de http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )
fonte
Além das respostas acima sobre permitir que um grupo leia / escreva, você também precisa adicionar o usuário ao grupo (diga "foo").
Nota: você terá que primeiro criar o usuário se ele não existir
fonte