Tem repositório git remoto recusar mesclar confirmações em push
O que eu quero fazer:
eu queronão permitir qualquermesclar confirmações ser estarempurrado para o repositório central. oúnica exceção sendo se a mesclagem é entre os ramos que existem no repositório central. Eu quero reforçar isso no repositório central.
Explicação de porque eu quero fazer isso:
Nota: Se esta explicação te tirar da trilha do que eu quero fazer, então ignore a explicação. É claro que estou feliz em ouvir outras maneiras de resolver o problema que explico abaixo, mas a resposta em que estou interessado é o que quero fazer como dito acima.
Eu tenho um repositório git central com uma ramificação que vários desenvolvedores rastreiam. Cada desenvolvedor tem um controle remoto configurado para o ramo desse repositório central.
Seguimos uma política de confirmação síncrona para este projeto, portanto, cada desenvolvedor deve sempre rebase seu trabalho mais recente em cima da ramificação remota HEAD antes de pressionar. Eu gostaria de reforçar essa política, impedindo que qualquer commit de mesclagem seja enviado ao repositório central. A única exceção é se a mesclagem estiver entre as ramificações existentes no repositório central.
Para simplificar, não quero que as ramificações de rastreamento locais do desenvolvedor sejam mescladas com a ramificação remota. Mas, em vez disso, sempre ser rebased no ramo remoto.
Nós parcialmente reforçamos isso na máquina do desenvolvedor, definindo branch.NAME.rebase = true, o que ajuda a evitar problemas se o desenvolvedor usa git pull, no entanto, precisamos de uma solução para impor isso no lado do repositório central.
Uma solução muito básica seria recusar commits com o comentário: "Mesclar ramificação 'NAME' de GITURL", no entanto, algo mais ao longo das linhas de verificação se todos os pais de um commit existem nos caminhos de ramificação do repositório central seria mais interessante.
Sugestões? Soluções?
Editar:
Isto é o que eu tenho até agora:
#!/bin/sh
read sha1old sha1new refname
# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
# this was a merge commit
# $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0
O local que fica problemático é determinar se a ascendência de dois pais se origina de um único ramo. Além disso, como o gancho pre-receive é chamado antes de quaisquer referências serem atualizadas, se um push contiver confirmações para duas ramificações existentes no remoto, incluindo uma mesclagem entre essas duas ramificações, não tenho ideia de qual seria a solução aqui .. .