Digamos que eu esteja colaborando com alguém por meio de um repositório git e haja um arquivo específico para o qual nunca quero aceitar nenhuma alteração externa.
Existe alguma maneira de configurar meu repositório local para não reclamar de um conflito de mesclagem toda vez que faço pull? Eu gostaria de sempre selecionar minha versão local ao mesclar este arquivo.
echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true
--global
tag. Se você deseja esse comportamento apenas para um único repo,--global
echo 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Respostas:
Sobre a instância específica de um arquivo de configuração, eu concordaria com a resposta de Ron :
uma configuração deve ser "privada" para sua área de trabalho (portanto, "ignorada", como em "declarada em um
.gitignore
arquivo").Você pode ter um modelo de arquivo de configuração com valores tokenizados e um script que transforma esse
config.template
arquivo em um arquivo de configuração privado (e ignorado).No entanto, essa observação específica não responde a uma questão mais ampla e geral, ou seja, sua pergunta (!):
Esse tipo de mesclagem é uma "mesclagem de cópia", na qual você sempre copiará a versão 'nossa' ou 'deles' de um arquivo sempre que houver um conflito.
Para "um arquivo" (um arquivo em geral, sem falar em um arquivo "config", já que é um mau exemplo), você conseguiria isso com um script personalizado chamado por meio de mesclagens.
O Git chamará esse script porque você terá de definir um valor gitattributes , que define um driver de mesclagem personalizado .
O "driver de mesclagem personalizado" é, neste caso, um script muito simples que basicamente manterá inalterada a versão atual, permitindo que você sempre selecione sua versão local.
IE., Conforme observado por Ciro Santilli :
Vamos testar isso em um cenário simples, com um msysgit 1.6.3 no Windows, em uma mera sessão do DOS:
Agora, vamos fazer dois arquivos, que terão conflitos, mas que serão mesclados de forma diferente.
Vamos introduzir um "conflito" no conteúdo de ambos os arquivos em dois branches diferentes do git:
Agora, vamos tentar mesclar "hisBranch" em "myBranch", com:
dirWithCopyMerge\b.txt
onde eu sempre quero manter a minha versão dob.txt
.Uma vez que a fusão ocorre em '
MyBranch
', voltaremos a ela e adicionaremos asgitattributes
diretivas ' ' que irão personalizar o comportamento da fusão.Temos um
.gitattributes
arquivo definido nodirWithCopyMerge
diretório (definido apenas no branch onde ocorrerá a fusão:)myBranch
, e temos um.git\config
arquivo que agora contém um driver de fusão.Se você ainda não definiu keepMine.sh e lançou a mesclagem mesmo assim, aqui está o que você obtém.
Está bem:
a.txt
está pronto para ser mesclado e tem conflitob.txt
ainda não foi alterado, pois o driver de mesclagem deve cuidar disso (devido à diretiva no.gitattributes
arquivo em seu diretório).Defina um
keepMine.sh
em qualquer lugar no seu%PATH%
(ou$PATH
para nosso amigo Unix. Eu faço ambos, é claro: tenho uma sessão do Ubuntu em uma sessão do VirtualBox)Conforme comentado por lrkwz e descrito na seção " Merge Strategies " de Customizing Git - Git Attributes , você pode substituir o script de shell pelo comando shell
true
.Mas, no caso geral, você pode definir um arquivo de script:
keepMine.sh
(que era um simples motorista de fusão;) (Ainda mais simples, nesse caso, o uso
true
)(Se você queria manter a outra versão, basta adicionar antes da
exit 0
linha:cp -f $3 $2
.É isso Mesclar motorista brindes manter a versão vinda do outro. filial, substituindo qualquer mudança local)
Agora, vamos tentar novamente a mesclagem desde o início:
A mesclagem falha ... apenas para a.txt .
Edite a.txt e deixe a linha de 'hisBranch', então:
Vamos verificar se b.txt foi preservado durante esta fusão
O último commit representa a mesclagem completa :
(A linha que começa com Merge prova isso)
Considere que você pode definir, combinar e / ou substituir o driver de mesclagem, como o Git fará:
<dir>/.gitattributes
(que está no mesmo diretório do caminho em questão): prevalecerá sobre o outro.gitattributes
nos diretórios.gitattributes
(que está no diretório pai), só definirá as diretivas se ainda não estiver definido$GIT_DIR/info/attributes
. Este arquivo é usado para substituir as configurações da árvore. Ele substituirá as<dir>/.gitattributes
diretivas.Por "combinação", quero dizer "agregar" vários drivers de mesclagem.
Nick Green tenta, nos comentários , realmente combinar os drivers de mesclagem: consulte " Mesclar pom's via driver git python ".
No entanto, como mencionado em sua outra pergunta , ele só funciona em caso de conflitos (modificação simultânea em ambos os ramos).
fonte
cp -f $3 $2
provavelmente deve ser citado, ou sejacp -f "$3" "$2"
.PATH
(Unix ou WindowsPATH
). Como esse script será interpretado por meio do shell bash do Unix ou do shell do Windows MingWin bash MsysGit, ele será portável.Como @ciro-santilli comentou, a maneira simples de fazer isso é usar
.gitattributes
com as configurações:e habilite essa estratégia com:
(Estou adicionando isso como uma resposta para torná-lo mais visível, mas tornando-o um Wiki da comunidade para não tentar obter acima dos créditos do usuário para mim.
fonte
:-)
).Temos vários arquivos de configuração que nunca queremos sobrescritos. No entanto, .gitignore e .gitattributes não funcionaram em nossa situação. Nossa solução foi armazenar os arquivos de configuração em um branch de configurações. Em seguida, permita que os arquivos sejam alterados durante a fusão git, mas imediatamente após a fusão, use "git checkout branch -." para copiar nossos arquivos de configuração do branch de configurações após cada fusão. Resposta detalhada do stackoverflow aqui
fonte