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

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

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

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

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

Существует ли способ настроить мерзавца этот путь? Я хотел бы найти автоматическое решение:) - так, чтобы слияние могло быть сделано, как обычно.


Править: вот решение, которое работало на меня (Благодаря VonC для совета относительно gitattribute)

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

.gitattributes (отслеживают с мерзавцем, если Вы хотите совместно использовать это), или .git/info/attributes:

file1      merge=keepmine
path/file2     merge=keepmine

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

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

.git/config:

#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

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

24
задан Evgeny 1 December 2009 в 19:14
поделиться

3 ответа

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

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

14
ответ дан 29 November 2019 в 00:18
поделиться

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

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

3
ответ дан 29 November 2019 в 00:18
поделиться

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

2
ответ дан 29 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: