Возможно ли иметь git локальных веток с разными конфигурационными файлами? - PullRequest
0 голосов
/ 27 марта 2020

Мне интересно, возможно ли иметь в моем локальном репо главную ветку с файлом конфигурации с использованием учетных данных рабочей БД и ветку разработки с файлом конфигурации с другими учетными данными и БД.

Я безуспешно искал, самый близкий ответ, который я нашел, это использовать git атрибуты, но он работает только при сохранении файлов конфигурации в случае конфликта, когда происходит слияние. Я хочу постоянно хранить неизмененные файлы конфигурации в каждой ветке. Кто-нибудь знает, как мне этого добиться? Или какой-нибудь совет, как мне управлять этими файлами?

1 Ответ

1 голос
/ 27 марта 2020

Git на самом деле не о ветвях . Это действительно около коммитов . Ветви или, если быть точным, имена ветвей - это просто способ найти коммитов. Это коммиты имеют значение.

Если вы задаете вопрос следующим образом: Могут ли два разных коммита содержать файлы с одинаковым именем, но с разным содержимым? ответ ясно: да, они могут.

Как только вы зададите очевидный дополнительный вопрос: При двух разных коммитах, в которых файл F имеет разное содержимое, когда я сливаю эти commits, что происходит с содержимым F? вы видите, где начинает возникать проблема.

В Git слияние составляет объединение работы . Поскольку каждый коммит представляет снимок файлов, Git требуется третий коммит здесь. Этот третий коммит представляет собой общий общий коммит, который находится в обеих ветвях. Помните, что в Git фиксация часто происходит на многих ветвях одновременно . Фраза на ветке просто означает, что, используя имя ветви - tip commit ветки - и работая в обратном направлении, мы получаем соответствующий коммит.

Следовательно, если у нас есть строка коммитов, которая расходится:

          I--J   <-- branch1
         /
...--G--H
         \
          K--L   <-- branch2

, мы можем рассмотреть объединение работы , начав с общего общего коммита H, который содержит снимок всех файлов. Мы сравниваем этот снимок в H со снимком в J. Если файл F изменился с H на J, это изменение. Далее мы сравниваем снимок в H с снимком в L. Если файл F изменился здесь, это изменение. Git теперь будет объединять изменения .

Если изменения "настроить систему на односторонние действия" и "настроить систему на другие действия", эти изменения могут конфликтовать , Будут ли и как они конфликтовать, зависит от того, как работает конфигурация. Git понимает только строк . Если строка 47 файла F в коммите H изменяется в J и L и изменяется по-разному , это конфликт. Если только в commit J есть изменение в строке 47, Git считает, что все в порядке, чтобы принять это изменение от J.

Я хочу сохранить неизмененные файлы конфигурации в каждой ветке все время. Кто-нибудь знает, как мне этого добиться?

Обычный ответ: даже не пытайтесь. Эти файлы не должны зависеть от ответвления , потому что когда у вас есть это:

...--G--H   <-- master, dev

файлы в коммите H одинаковы, независимо от того, используете ли вы коммит H из-за имени master или из-за имени dev. Оба имени ветви идентифицируют один и тот же коммит H.

Вместо этого сделайте эти файлы конфигурации неотслеживаемыми (и, вероятно, также игнорируемыми ). Это означает, что Git никогда не обращает на них никакого внимания. Они не изменятся, когда вы переключаетесь с одного коммита на другой, или когда вы переключаетесь с одной ветви на другую, даже если это означает, что переключение коммитов тоже.

Делайте вещи на основе учетных данных и базы данных в разные рабочие деревья . Каждый репозиторий Git поставляется с рабочим деревом, так что вы можете просто использовать два разных клона одного и того же базового репозитория, чтобы легко получить два разных рабочих дерева.

Если ваш Git равен как минимум 2,5 ( и желательно, по крайней мере, 2,15 из-за довольно большой ошибки, которая не была исправлена ​​до этого момента), вы можете использовать один Git репозиторий с git worktree add, чтобы добавить второе рабочее дерево в один репозиторий.

Если вы действительно настаиваете на том, чтобы делать все это в одном репозитории и изменять файлы в зависимости от того, какую ветвь name вы указали в недавней команде git checkout или git switch, подумайте об использовании хука после проверки. Вы можете написать любой код, который вам нравится, в таком хуке, и вы можете прочитать название ветки, которая использовалась здесь. Это болезненно и сопряжено с трудностями: метод отдельного рабочего дерева намного эффективнее, если вы можете позволить себе место на диске.

...