Есть много связанных вопросов, связанных с фильтрами smudge/clean - я потратил несколько часов на их чтение и пробовал различные варианты, но все еще не смог. Надеюсь, я могу спросить, каким образом я получаю ответ, который работает для меня.
В частности, я прочитал эту страницу на большинстве этих ответов, ссылаясь на:
TL;DR
Детальный вопрос, но резюме:
- Можно ли хранить
DEBUG = false
в файле в одной ветке иDEBUG = true
в другой ветке, используя фильтры smudge/clean для управления этим файлом? И как?
Фон
У меня есть разные удаленные репозитории, размещенные на битбакете. Я использую SourceTree на Win8, чтобы клонировать удаленные репозитории к моему ноутбуку. Я создаю разные ветки для разработки, функций, выпусков и т.д. (После успешная Git ветвящаяся модель для улучшения или хуже).
У меня есть класс Java java под названием Dbug.java
, который содержит логическое значение, которое включает/выключает различные протоколы отладки, mocking и т.д. в моем коде.
public static final boolean DEBUG = false;
Я хотел бы, чтобы это значение было false
в моей ветки "production" (master) и было true
в моих ветвях функций.
- Возможно ли использование фильтров, или я уже неправильно понял прецедент?
- Я не уверен, что фильтры работают так, как между двумя ветвями одного локально размещенного репо, или если фильтры работают только между двумя репозиториями.
Создание фильтров
Работая локально, я проверил производственную ветвь. Я создал тестовый файл с именем debug_flag.txt
со следующим содержимым:
// false on production branch
// true on other branches
DEBUG = false;
Я создал файл в корне моего локального репо под названием .gitattributes
и добавил ссылку на фильтр:
debug_flag.txt filter=debug_on_off
Я обновил файл .git/config
с помощью определения фильтра:
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s 's/DEBUG = false/DEBUG = true/'
- В моем понимании это должно гарантировать, что у моего файла всегда есть ложное значение в производстве, но будет иметь истинное значение, когда я перейду от производство.
- Правильно ли это?
Тестирование фильтров
Я создал новую ветвь test
, используя:
git checkout -b test
Я проверил содержимое моего файла:
$ cat debug_flag.txt
// false on production branch
// true on other branches
DEBUG = false;
- Я ожидал увидеть значение
true
в файле - Не должен ли фильтр "smudge" запускаться, когда я проверил файл?
Я добавил новую строку в файл и зафиксировал ее. Затем я переключился обратно в производственную ветвь, и здесь ситуация становится странной.
Если я смотрю на файл в SourceTree, никаких изменений в этой ветке с момента его создания нет. Этого я и ожидал бы, поскольку единственное изменение было сделано в другой ветке.
Если я смотрю на файл в терминале или Notepad ++, я вижу, что мое значение изменилось:
$ cat debug_flag.txt
// false on production branch
// true on other branches
DEBUG = true;
Я еще не объединил изменение между тестовой ветвью, я не сделал фиксацию на производственной ветке, но изменился файл.
- похоже, что фильтр smudge был запущен в файле внутри этой ветки, но не через ветки.
Мне не хватает жизненно важной части головоломки, и, надеюсь, это нечто простое, что может быть замечено кем-то, у кого есть опыт.
Моя ставка заключается в простом непонимании концепции.
Запрос Pls для любой отсутствующей информации...
Обновление на основе ответа VonC
Настройка базовых фильтров работала достаточно хорошо. Определили фильтр в файле config
следующим образом:
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s 's/DEBUG = false/DEBUG = true/'
Создание новой ветки исправляет false → true, слияние обратно меняет true → false.
Завершение изменения только для производственной (основной) ветки требовало специальных скриптов, которые знали о ветке, из которой они выполняются. Таким образом, файл config
стал:
[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
В этот момент я сталкиваюсь с несоответствиями между тем, что видит SourceTree, и тем, что показано в Notepad ++ для содержимого файла отладки. SourceTree показывает изменения, но Notepad ++ - нет.
Я принимаю ответ VonC, так как он отвечает на основной вопрос, который я задал.
Однако я, скорее всего, буду реализовывать решение которое я написал, поскольку он решает основную проблему, которую я пытаюсь решить, более простым способом (для меня): сохранение другого конфигурационного файла в отдельных ветвях.