Git: объединение государственных и частных веток при сохранении определенных файлов в обеих ветвях

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

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

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

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

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


EDIT: здесь решение, которое сработало для меня (спасибо VonC за советы по gitattribute)

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

.gitattributes(трек с git, если вы хотите поделиться этим) или .git/info/attributes:

file1      merge=keepmine
path/file2     merge=keepmine

keepmine - это именованный пользовательский менеджер слияния, который является просто командой do-nothing вместо внутреннего драйвера слияния на выбранных файлах, которая настроена ниже

При слиянии из частного в публичный филиал я обычно делаю 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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Сохранять пароли под управлением версиями - это худшая идея. Для работы с отдельными файлами вам требуется CVS, а не git. Git как и многие другие современные DVCS, работающие со всем деревом, а не с отдельными файлами.