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, работающие со всем деревом, а не с отдельными файлами.