Eu usei algo assim antes; foi assim que funcionou.
Configuração de Repo
- Crie um repositório git, "etc_files".
- Crie uma ramificação para cada tipo de máquina, por exemplo, "servidor / www", "servidor / dev" etc.
- git suporta barras nos nomes das ramificações. Isso me ajuda a manter os galhos diretos na minha cabeça.
- Se você tiver poucas máquinas suficientes, poderá ter uma filial para cada máquina individual.
- Crie uma filial para cada parte da infraestrutura compartilhada, por exemplo "módulos / apache", "módulos / cups", etc.
- Essas ramificações são para armazenar arquivos que são os mesmos entre todas as máquinas, como
/etc/resolv.conf
. Estes seriam os arquivos que você mantém em repositórios "svn: externals" agora.
- Essas ramificações são para armazenar arquivos que são os mesmos entre todas as máquinas, como
Construindo uma nova máquina
- Em uma nova máquina, clone o repositório git e confira a ramificação desse tipo de máquina.
- Eu faço deste um clone somente leitura para evitar que as pessoas cometam alterações de máquinas de produção sem testes.
- Configure um cron job para automaticamente
git pull
do repositório todos os dias.
Mudando de galhos de máquinas
Alterar o código em uma única ramificação da máquina é simples; apenas git checkout
o ramo apropriado em seu ambiente de desenvolvimento, faça as alterações e envie-as de volta ao repositório central. Todas as máquinas nessa ramificação receberão as alterações automaticamente na próxima vez em que a tarefa do cron for executada.
Alterando ramificações de módulos
Alterar o código para um ramo de módulo é apenas um pouco mais complicado, pois envolve duas etapas:
-
git checkout
o ramo do módulo apropriado - Faça suas alterações e confirme-as no servidor centralizado.
-
git checkout
de cada ramificação de máquina que usa essa ramificação do módulo e, em seguida, mescla a ramificação do módulo nela. O git irá descobrir que você mesclou esse ramo antes e só notará as mudanças que aconteceram desde o último pai comum.
Este método tem benefícios e desvantagens. Uma vantagem é que eu posso fazer uma alteração em uma ramificação do módulo e aplicá-la às ramificações da máquina que precisam dela, o que permite que as ramificações da máquina não permaneçam na versão mais antiga até que estejam prontas. A desvantagem, então, é que você precisa se lembrar de mesclar sua ramificação de módulo em cada ramificação de máquina que possa estar usando-a. Eu uso um script que atravessa a árvore de commit e automaticamente faz essa mesclagem para mim, mas ainda pode ser uma dor.
Como alternativa, versões mais recentes do git oferecem suporte a algo chamado " submódulos ":
Submodules allow foreign repositories to be embedded within a dedicated subdirectory of the source tree, always pointed at a particular commit.
Isso permitiria que você construísse algo um pouco como as árvores "svn: externals", que você poderia atualizar da mesma maneira como faz agora.