git smudge / filtro limpo entre galhos
Existem muitas perguntas relacionadas a filtros borrados / limpos - passei algumas horas lendo-os e tentando várias opções, mas ainda falhando. Espero poder pedir de uma maneira que eu receba uma resposta que funcione para mim.
Especificamente, li a página com a qual a maioria dessas respostas está vinculada:
Personalizando o Git - Atributos do Gittl; drÉ uma pergunta detalhada, mas o resumo é:
Posso guardarDEBUG = false
em um arquivo em uma ramificação eDEBUG = true
em outro ramo, usando filtros de manchas / limpeza para gerenciar esse arquivo? E como?fundoEu tenho vários repositórios remotos hospedados no bitbucket. Estou usando o SourceTree no Win8 para clonar os repositórios remotos no meu laptop. Crio ramos diferentes para desenvolvimento, recursos, lançamentos etc. (a seguirUm modelo de ramificação Git bem-sucedido para melhor ou pior).
Eu tenho uma classe java Android chamadaDbug.java
que contém um booleano que ativa / desativa vários recursos de log de depuração, zombaria etc. no meu código.
public static final boolean DEBUG = false;
Eu gostaria que esse valor fossefalse
no meu ramo de "produção" (mestre) e sertrue
nos meus ramos de recursos.
Trabalhando localmente, verifiquei o ramo de produção. Eu criei um arquivo de teste chamadodebug_flag.txt
com o seguinte conteúdo:
// false on production branch
// true on other branches
DEBUG = false;
Criei um arquivo na raiz do meu repositório local chamado.gitattributes
e adicionou a referência de filtro a ele:
debug_flag.txt filter=debug_on_off
Eu atualizei o.git/config
arquivo com a definição de filtro:
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s 's/DEBUG = false/DEBUG = true/'
No meu entendimento, isso deve garantir que meu arquivo sempre tenha um valor falso na produção, mas terá um valor verdadeiro quando eu sair da produção.Este é um entendimento correto?Testando os filtrosEu criei um novo ramotest
usando:
git checkout -b test
Eu verifiquei o conteúdo do meu arquivo:
$ cat debug_flag.txt
// false on production branch
// true on other branches
DEBUG = false;
Eu esperava ver o valortrue
no arquivoO filtro "borrar" não deveria ter sido executado quando eu fiz o check-out do arquivo?Adicionei uma nova linha ao arquivo e confirmei. Voltei para o ramo de produção e é aqui que as coisas acontecemesquisito.
Se eu olhar o arquivo no SourceTree, não há alterações neste ramo desde que ele foi criado. Isso é o que eu esperaria, uma vez que a única alteração foi feita em um ramo diferente.
Se eu olhar o arquivo no terminal ou o Notepad ++, vejo que meu valor mudou:
$ cat debug_flag.txt
// false on production branch
// true on other branches
DEBUG = true;
Ainda não mesclei a alteração na ramificação de teste, ainda não fiz uma confirmação na ramificação de produção.o arquivo mudou.
parece que o filtro de manchas foi executado no arquivo nessa ramificação, mas não nas ramificações.Estou perdendo uma peça vital do quebra-cabeça, e espero que seja algo simples que possa ser descoberto por alguém com experiência em fazer isso.
Minha aposta é que este é um simples mal-entendido do conceito.
Pls solicitar qualquer informação em falta ...
Atualização baseada na resposta do VonCA configuração dos filtros básicos funcionou muito bem. Definiu o filtro noconfig
arquivo como:
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s 's/DEBUG = false/DEBUG = true/'
Criar uma nova ramificação corrige false -> true, mesclando as alterações true -> false.
A restrição da mudança apenas à ramificação de produção (mestre) exigia scripts personalizados que estavam cientes da ramificação da qual estavam sendo executados. Então oconfig
o arquivo se tornou:
[filter "debug_on_off"]
clean = ./scripts/master_clean.sh
smudge = ./scripts/master_smudge.sh
master_clean.sh:
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "master" = "$branch" ]; then
sed -e s/DEBUG = true/DEBUG = false/ $1
else
cat $1
fi
master_smudge.sh:
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "master" = "$branch" ]; then
sed -e s/DEBUG = false/DEBUG = true/ $1
else
cat $1
fi
Neste ponto, estou enfrentando inconsistências entre o que o SourceTree está vendo e o que está sendo mostrado no Notepad ++ para o conteúdo do arquivo de depuração. O SourceTree está mostrando as alterações, mas o Notepad ++ não está.
Estou aceitandoResposta do VonC, uma vez que responde à pergunta básica que eu fiz.
No entanto, provavelmente implementarei osolução que escrevi, uma vez que resolve o problema subjacente que estou tentando resolver, de uma maneira mais fácil (para mim): mantendo um arquivo de configuração diferente em ramificações separadas.