.gitattributes & estratégia de mesclagem individual para um arquivo

Eu tenho um mestre e um ramo de teste do meu aplicativo (web). Esses projetos são quase os mesmos, exceto por um arquivo que configura o aplicativo, digamos “setup”.

Sempre que eu mescle uma ramificação na outra, gostaria que essa ramificação mantivesse sua versão da configuração. Ou seja, o git não deve tentar mesclar as alterações nesse arquivo.

Eu segui a orientação do livro Pro Git e criei um arquivo .gitattributes, com a linha “setup merge = ours”. No entanto, isso não funciona – nem com o avanço rápido não se mescla se eu introduzir conflitos.

(Para ser mais preciso:

$: mkdir gitest $: cd gittest $: git init $: echo "setup merge=ours" >> .gitattributes $: echo "master" >> setup $: git add setup .gitattributes $: git commit -a -m ... $: git branch test $: git checkout test $: echo "test" >> setup $: git commit -a -m ... $: git checkout master $: git merge test 

Resultado esperado: a configuração contém a palavra “mestre”, em vez disso o git realiza uma fusão de ff e a configuração é “teste”.

Eu tive o mesmo erro e pode ser resolvido apenas definindo um driver de mesclagem “nosso” em .git / config:

 [merge "ours"] name = "Keep ours merge" driver = true 

Como true sempre retorna 0, o arquivo temporário que contém o estado atual não será alterado e permanecerá como a versão final.

Você pode ler mais sobre o driver de mesclagem aqui: http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_defining_a_custom_merge_driver

Termo aditivo:

Isso funciona sempre que o driver é realmente chamado e isso parece ocorrer apenas quando há commits alterando os mesmos arquivos (git o atributo de mesclagem). Se houver mudanças em uma única ramificação, o driver não será chamado.

Descobri que, se eu modificasse os arquivos em ambas as ramificações e fizesse as modificações em cada ramificação, e depois tentasse a mesclagem, ele invocaria o driver de mesclagem e escutaria meus .gitattributes que especificam merge=ours . Depois disso, os dois arquivos sempre diferem nos dois ramos e, portanto, o driver de mesclagem sempre será chamado, portanto, não precisei ter um driver de mesclagem personalizado que tomasse o arquivo. Só foi necessário ter ambos modificados inicialmente.

O driver de mesclagem é chamado apenas em casos não-triviais, ou seja, se o mestre e o teste tiverem tocado na configuração (e você precisa definir primeiro o driver de mesclagem):

 git init git config merge.ours.name '"always keep ours" merge driver' git config merge.ours.driver 'touch %A' echo "setup merge=ours" >> .gitattributes echo "master" >> setup git add setup .gitattributes git commit -a -m ... git branch test git checkout test echo "test" >> setup git commit -a -m ... git checkout master echo "more content" >> setup git commit -a -m ... git merge test 

Tendo dito isso, eu me pergunto se é sensato ter a configuração no repository. Se você realmente quiser isso sob version control, você pode usar submódulos ou a estratégia de mesclagem da subtree para manter os arquivos comuns em sincronia.

Tenha um roteiro limpo de manchas em vez de ramos separados. O script pode ser diferente dependendo de qual máquina você está.