Git: fundir ramos públicas e privadas, enquanto ao mesmo tempo manter determinados arquivos intacto em ambos os ramos
Pergunta
Eu li algumas perguntas git aqui, mas não conseguiu encontrar uma resposta a esta:
Eu tenho um público e um privado ramos onde eu quero permitir que certos arquivos a divergir.
Esses são arquivos de configuração com senhas e meus personalizações locais.
Eu quero ser capaz de mesclar os ramos nos dois sentidos: do privado ao público e para trás, mas eu não quero nunca ter esses arquivos específicos fundiu automaticamente
.Existe uma maneira de configurar git desta maneira? Eu adoraria encontrar uma solução automatizada :) -. Modo que a fusão poderia ser feito como de costume
EDIT: aqui está a solução que funcionou para mim (Graças a VonC para o conselho em gitattribute)
A única coisa inesperada para mim foi que a "proteção merge" começa a trabalhar somente após arquivos divergiram nos dois ramos, não imediatamente após a seguinte configuração foi aplicada
.gitattributes (pista com git se você deseja compartilhar isso) ou .git / info / atributos:
file1 merge=keepmine
path/file2 merge=keepmine
keepmine é o gerente merge personalizado nomeado que é apenas um comando do-nothing chamado em vez do controlador merge interna nos arquivos selecionados, que está configurado abaixo
Ao mesclar a partir privada para ramo público que eu costumo fazer git merge --squash private
. Dessa forma, as edições particulares não vai entrar na história git no ramo público.
.git / config:
#public repository
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = <public repo git url>
#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
push = +:
url = /path/to/local/private/repo
[merge "keepmine"]
name = dont_merge_selected_files
driver = echo %O %A %B
[branch "master"]
remote = origin
merge = refs/heads/master
#private branch settings
[branch "mybranch"]
remote = private
merge = refs/heads/mybranch
Se há uma maneira de melhorar este comentário, por favor
Solução
Para estar no lado seguro, você pode adicionar um git attribute
(veja aqui para ver um exemplo ) para esses arquivos privados.
Dessa forma, você pode definir um script (um "gerente merge"), que irá garantir que o arquivo incluindo informações privadas permanecerá vazio (ou com um conteúdo público) se fundiram no ramo público, mantendo seu conteúdo local, se mesclado para o ramo privado.
Isso significa que você pode mesclar / rebase sem pensar sobre esse arquivo.
Outras dicas
Uma maneira de fazer isso é com git rebase
. Ao manter as alterações privadas como alguns commits off no final da sua master
, você pode cometer coisas público para o ramo master
(ou o que você escolher o seu ramo de trabalho a ser), e depois rebase seu ramo particular contra o mestre sempre que quiser atualização .
Outra maneira de lidar com isso é para manter os arquivos de configuração de modelo no Git, como frobozz.config.template
. Em seu diretório de trabalho, copie frobozz.config.template
ao frobozz.config
(sem versão) e modificar. Apenas certifique-se de fazer backup de seu diretório de trabalho também, se você precisa de suas alterações locais para o backup.
Isso só parece funcionar se houver conflitos de mesclagem detectados. Mesclando e para trás entre os ramos o arquivo não obter substituído. A menos que eu definir alguma coisa errada. Claro que isso nos em janelas msysgit git versão 1.6.5.1.1367.
senhas manter sob controle de versão é a pior idéia que nunca. Você precisa CVS, não Git, para trabalhar com arquivos separados. Git como muitos outros DVCS modernos que trabalham com a árvore inteira, não com arquivos separados.