Como configurar o git repo, a fim de empurrar como atualmente o controle remoto rejeitá-lo?

3

Eu quero configurar um repositório GIT para um site. Múltiplos usuários terão um clone do repositório em sua máquina local e, no final de cada dia, eles enviarão seu trabalho para o servidor. Eu posso configurar um repositório simples, mas eu quero um repositório dir / non-bare.

A idéia é que o diretório de trabalho do repositório será a pasta raiz do site. No final de cada dia, todas as alterações serão visíveis diretamente. Mas não consigo encontrar uma maneira de fazer isso.

A inicialização do repositório do servidor com git init apresenta o seguinte erro quando um cliente está tentando enviar alguns arquivos:

git push origin master
[email protected]'s password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ssh://[email protected]/home/orangetux/www/
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://[email protected]/home/orangetux/www/'

Então, eu estou querendo saber se este é o caminho certo para configurar um repositório GIT para um site? Se sim, como tenho que fazer isso? Se não, qual é a melhor maneira de configurar um repositório GIT para o desenvolvimento de um site?

Eu vi você não pode empurrar para um repositório não nu , mas como isso resolve o meu problema? Criar um repositório vazio no servidor e ter um clone desse repositório no mesmo servidor na pasta htdocs? Isso parece um pouco desajeitado para mim. Para ver o resultado de um commit eu tenho que clonar o repositório a cada vez.

    
por OrangeTux 07.07.2012 / 21:07

2 respostas

4

To see the result of a commit I've to clone the repository each time.

Não é necessário clonar novamente, apenas git pull das alterações mais recentes de cada vez.

Para fazer isso automaticamente, basta adicionar os comandos corretos ao gancho <barerepo>/hooks/post-update em seu repositório bare.

  • O método A, website é um clone completo do repositório principal:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                (unset GIT_DIR && cd "$dir" && git pull --quiet --ff-only)
            fi
        done
    fi
    

    Dica: Se os dois repos estiverem na mesma máquina, use git clone --shared /path/to/bare para economizar espaço reutilizando o diretório de objetos do repositório nu.

    Observação: há possíveis problemas de segurança com o método A - um estranho pode simplesmente fazer o download do diretório .git com o código-fonte do seu site, caso você não o mova para outro local.

  • Método B, o site é apenas um checkout:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                # Must give a path (such as ".") to avoid switching HEAD.
                git --work-tree="$dir" checkout -f "$ref" -- .
            fi
        done
    fi
    

Para os dois ganchos, execute git config hooks.checkoutTo /var/www dentro do repositório nulo (ou edite manualmente o arquivo <barerepo>/config ) para definir o caminho de destino.

Ambos os ganchos são escritos para serem ativados somente quando a ramificação master é atualizada.

Verifique se o arquivo de gancho é executável ( chmod +x ). Veja githooks (5) para detalhes.

Nota: Tecnicamente, você pode empurrar para um repositório não-nu - o Git simplesmente rejeitará o envio para o ramo atualmente em check-out (pressionar para outros ramos está correto). Mesmo essa verificação pode ser desabilitada, mas é apenas um convite para problemas ... Também é muito mais limpo e melhor para os backups manterem os repositórios nus em um único diretório (por exemplo, ~/srv/git ou ~/Public/Git ).

    
por 07.07.2012 / 23:08
0

[remote rejected] master -> master

Ele é rejeitado por controle remoto, por isso, certifique-se de que seu repositório que você está empurrando esteja atualizado, puxando e empurrando novamente:

git pull; git push

Se ainda for recusado, tente enviar primeiro um ramo diferente:

git push origin master:foo

para que o proprietário do repositório possa mesclar sua filial.

Se você fez algumas alterações nos commits por meio de rebase , provavelmente desejará forçá-lo via -f .

Como alternativa, desative denyCurrentBranch na via remota (não recomendado):

git config receive.denyCurrentBranch ignore
    
por 30.09.2015 / 18:03