Git: fundir ramos públicas e privadas, enquanto ao mesmo tempo manter determinados arquivos intacto em ambos os ramos

StackOverflow https://stackoverflow.com/questions/1807036

  •  05-07-2019
  •  | 
  •  

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top