Гит:объединение общедоступных и частных веток, сохраняя при этом определенные файлы в обеих ветках нетронутыми

StackOverflow https://stackoverflow.com/questions/1807036

  •  05-07-2019
  •  | 
  •  

Вопрос

Я прочитал здесь несколько вопросов по git, но не смог найти ответа на этот:

У меня есть публичная и частная ветки, в которых я хочу разрешить определённым файлам расходиться.

Это файлы конфигурации с паролями и моими локальными настройками.

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

Есть ли способ настроить git таким образом?Очень хотелось бы найти автоматизированное решение :) - чтобы слияние можно было производить как обычно.


РЕДАКТИРОВАТЬ: вот решение, которое сработало для меня (спасибо VonC за совет по gitattribute)

единственной неожиданностью для меня было то, что "защита от слияния" начинает работать только после того, как файлы разошлись в двух ветках, а не сразу после применения следующей конфигурации

.gitattributes (отслеживайте с помощью git, если хотите поделиться этим) или .git/info/attributes:

file1      merge=keepmine
path/file2     merge=keepmine

Keepmine — это именованный пользовательский менеджер слияния, который представляет собой просто ничего не делающую команду, вызываемую вместо внутреннего драйвера слияния для выбранных файлов, который настроен ниже.

При слиянии частной ветки с публичной я обычно делаю git merge --squash private.Таким образом, частные изменения не попадут в историю git в публичной ветке.

.git/конфигурация:

#public repository
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = <public repo git url> 

#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
    push = +:
    url = /path/to/local/private/repo 
[merge "keepmine"]
    name = dont_merge_selected_files
    driver = echo %O %A %B 
[branch "master"]
    remote = origin
    merge = refs/heads/master 

#private branch settings
[branch "mybranch"]
    remote = private
    merge = refs/heads/mybranch

если есть способ улучшить это, пожалуйста, прокомментируйте

Это было полезно?

Решение

На всякий случай можно добавить git attribute (видеть здесь для примера) для этих личных файлов.

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

Другие советы

Один из способов сделать это — с помощью git rebase.Сохраняя ваши личные изменения в виде нескольких коммитов в конце вашего master, вы можете передать общедоступные материалы в master ветку (или любую другую, которую вы выберете в качестве рабочей ветки), а затем переустанавливайте свою частную ветку на главную всякий раз, когда вы захотите обновить ее.

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

Кажется, это работает только в том случае, если обнаружены конфликты слияния.При слиянии между ветками туда и обратно файл перезаписывается.Если только я не настроил что-то не так.Конечно, это касается Windows msysgit git версии 1.6.5.1.1367.

Хранить пароли под контролем версий — худшая идея.Для работы с отдельными файлами вам нужен CVS, а не git.Git, как и многие другие современные DVCS, работает со всем деревом, а не с отдельными файлами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top