Git: объединение публичных и приватных веток с сохранением определенных файлов в обеих ветках
Я прочитал несколько мерзавцев здесь, но не смог найти ответ на этот вопрос:
У меня есть открытая и закрытая ветки, где я хочу разрешить расхождение определенных файлов.
Это файлы конфигурации с паролями и моими локальными настройками.
Я хочу иметь возможность объединять ветви в обоих направлениях: от частного до общего и обратно, но я не хочу, чтобы эти конкретные файлы объединялись автоматически.
Есть ли способ настроить Git таким образом? Я хотел бы найти автоматизированное решение:) - так, чтобы слияние могло быть сделано как обычно.
РЕДАКТИРОВАТЬ: вот решение, которое работало для меня (спасибо VonC за советы по gitattribute)
единственной неожиданностью для меня было то, что "защита от слияния" начинает работать только после того, как файлы разошлись в двух ветвях, а не сразу после применения следующей конфигурации
.gitattributes (отслеживать с помощью git, если вы хотите поделиться этим) или.git /info/attribute:
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
если есть способ улучшить это, пожалуйста, прокомментируйте
4 ответа
Чтобы быть в безопасности, вы можете добавить git attribute
(см. здесь пример) для этих личных файлов.
Таким образом, вы можете определить скрипт ("менеджер слияния"), который будет гарантировать, что файл, включающий в себя личную информацию, останется пустым (или с общедоступным контентом) при слиянии в общедоступной ветви, сохраняя при этом свой локальный контент при слиянии с частным ветка.
Это означает, что вы можете объединить / перебазировать, не думая об этом файле.
Похоже, что это работает, только если обнаружены конфликты слияния. Сливая туда-сюда ветки, файл перезаписывается. Если я что-то не так настрою. Конечно, это в Windows msysgit Git версии 1.6.5.1.1367.
Один из способов сделать это с git rebase
, Сохраняя ваши личные изменения как несколько коммитов с конца вашего master
Вы можете сделать публичные вещи master
ветвь (или какую-либо другую рабочую ветвь, которую вы выбираете), а затем перебазируйте вашу частную ветвь против master, когда вы захотите обновить.
Другой способ справиться с этим - сохранить файлы конфигурации шаблонов в Git, такие как frobozz.config.template
, В вашем рабочем каталоге скопируйте frobozz.config.template
к (не версионному) frobozz.config
и изменить. Просто убедитесь, что вы создали резервную копию своего рабочего каталога, если вам нужны локальные изменения для резервного копирования.
Хранить пароли под контролем версий - худшая идея. Вам нужен CVS, а не git, для работы с отдельными файлами. Git, как и многие другие современные DVCS, работает со всем деревом, а не с отдельными файлами.