Como você está aplicando o comportamento do git, inclusive localmente (principalmente no Windows)?

13

Estou pensando em mudar essa loja .NET do svn para o git e identifiquei alguns problemas auxiliares que gostaria de ter uma solução antes de ativar o switch.

O que eu estou perguntando em particular nesta pergunta é a imposição de final de linha. Por padrão, o git for windows instala com o 'checkout crlf, commit lf', que não funcionará para um monte de fontes que (até onde eu saiba) sejam exclusivamente compostas de terminações crlf.

Eu não sei se confiava cegamente em qualquer desenvolvedor para configurar isso corretamente, mesmo com instruções dadas, por isso estou considerando um (ou ambos) dos itens a seguir, mas fiquei curioso para saber se alguém aqui havia seguido outra rota.

  • Um gancho de pré-confirmação que verifica qualquer final de linha lf (ou talvez todos os finais de linha lf) e rejeita nesse caso.
  • Um script de instalação distribuído para desenvolvedores que preenche a configuração global com o 'como está, como está'.

PS Enquanto escrevia isso, ocorreu-me que a conversão inicial de svn para git poderia se comprometer da maneira padrão e contanto que as pessoas continuassem com o padrão, o que também seria bastante uniforme. Tendo sido um desenvolvedor usando o git em uma loja do .NET que instalou o git com o não-padrão 'como está, como está', criei meus próprios problemas lá também (todos rolaram o padrão antes da minha chegada) . Então, eu ainda estou inclinado a algum tipo de mecanismo de imposição.

ndarwincorn
fonte
2
No lado do servidor de gancho de pré-recebimento, isso deve ser possível (assegure as terminações do crlf e falhe, caso contrário); com um gancho de atualização, você também poderá atualizar a pré-mesclagem. Que tipo de servidor git você está usando? Se isso tiver que ser feito no lado da estação de trabalho, um gerenciador de configuração pode ser o caminho a seguir, mas mais difícil e com várias desvantagens. Último recurso é linting na CI e deixar de cumprir as pessoas a procedimentos de acompanhamento
Tensibai
1
Concordo com Tensibai e acrescentaria que a opção que você seleciona deve basear-se em quão estritamente você acredita que isso deve ser aplicado. Ganchos de pré-confirmação para aplicação rigorosa, sugerindo relatórios de conformidade pós-confirmação.
precisa saber é o seguinte
Obrigado Dave, minha justificativa para uma aplicação mais rigorosa do lado do cliente é que isso implicaria menos trabalho geral para mim e detectaria os erros mais cedo. Não indo para o CM nas estações de trabalho dos desenvolvedores, mas os servidores de desenvolvimento estão todos no DSC, portanto, adicionar isso será trivial. Edit: Obrigado também @Tensibai ... você poderia elaborar as desvantagens que vê no lado do cliente?
Ndarwincorn 17/04
1
Principalmente, se você aplica um cliente de gancho global, pode acabar impedindo o trabalho em projetos que precisam de finais. E você precisa configurá-lo de alguma forma, não pode ter certeza de que todos seguirão a configuração correta. Eu tenho certeza que há outros footguns Eu não pensar agora
Tensibai
O que você acabou fazendo para resolver seu problema?
Newtopian

Respostas:

6

Para responder à pergunta de como impor algo localmente, você não pode, sem fazer muito trabalho pesado ao gerenciar e impor o estado de todas as estações de trabalho de desenvolvedores, e geralmente sou da opinião de que os desenvolvedores provavelmente devem ser administradores locais em seu desenvolvimento máquina porque, se não estiverem, gastarão seu tempo imaginando como obter esses privilégios de qualquer maneira.

E isso é provavelmente porque você não precisa se preocupar com o estado da configuração local ao usar o controle de versão distribuído. Você só deve se preocupar com o estado da sua configuração. Supondo que você esteja usando o git como um sistema centralizado de controle de versão, porque é o que basicamente todo mundo faz de qualquer maneira, porque é o mais fácil, então vamos assumir que a configuração "your" é a cópia do código salvo no servidor central.

Se for esse o caso, você não deve aceitar mesclagens que, como você mencionou, quebram as terminações de linha crlf / lf. Portanto, você aplica isso quando algum outro cliente tenta fazer alterações com a lógica do servidor que rejeita a solicitação de poluir seu repositório com suas escolhas estilísticas potencialmente prejudiciais.

hvindin
fonte
4

Exigimos um processo de revisão usando solicitações Pull no github em nossos principais ramos de desenvolvimento ou mestre. Durante esse processo de revisão, marcaremos as solicitações pull como exigindo alterações se muitos arquivos tiverem diferenças de espaço em branco ou final de linha, e insistiremos para que sigam a formatação do ramo dev ou master para o qual estão solicitando pull.

Também existem algumas ferramentas legais, dependendo de quais idiomas você usa e quais ferramentas de IC você usa, quais podem, durante o processo de compilação ou a etapa de solicitação pull, formatar automaticamente o código com base nas regras que você configurou. Isso também ajuda a manter o código com aparência consistente e a minimizar os problemas de formatação ao confirmar o código.

avi
fonte
Você gostaria de elaborar as ferramentas que está usando? Dado que existem várias maneiras de conseguir isso, e nós temos as nossas próprias, mas ainda precisamos implementá-las dessa maneira, estou curioso para saber como você está resolvendo isso.
Ndarwincorn
1
Estamos usando texto datilografado, github e jenkins. O texto datilografado possui um bom ecossistema para esse tipo de coisa.
avi
3

Você pode usar a configuração por repositório para substituir a configuração do usuário por repositório. Quando feito no repositório considerado a fonte central, ele deve se propagar com clones e puxar para outros repositórios, incluindo locais, substituindo, assim, centralmente a configuração local.

Você pode aplicar isso ainda mais através de ganchos no seu repositório central para verificar se as terminações dos arquivos são o que deveriam ser e rejeitar a mesclagem / envio, caso não seja um kosher. No entanto, esses ganchos não serão clonados com o repositório, pelo menos não diretamente, mas isso não é necessário, pois as regras realmente precisam ser aplicadas no repositório central.

Usando modelos no seu git init, você pode garantir que seus repositórios sejam criados iguais a todos os arquivos gitignore, gitattributes etc, exatamente como você deseja.

Por último, não diretamente relacionado à sua pergunta, encontrei o maior ponto de atrito ao levar o svn saavy team para um fluxo de trabalho baseado em git, o que os acostumaria com o repo extra no meio. Eu descobri que essa folha de dicas visuais ajudou a explicar um pouco qual comando tinha qual efeito para qual parte.

Espero que isso tenha ajudado um pouco.

Newtopian
fonte