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?fundo

Eu 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.

Isso é possível usando filtros, ou eu já entendi mal o caso de uso?Não tenho certeza se os filtros funcionam assim entre duas ramificações do mesmo repositório hospedado localmente ou se os filtros funcionam apenas entre dois repositórios.Criando os filtros

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 filtros

Eu 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 VonC

A 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.

questionAnswers(4)

yourAnswerToTheQuestion