Git: объединение публичных и приватных веток с сохранением определенных файлов в обеих ветках - PullRequest
23 голосов
/ 27 ноября 2009

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

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

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

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

Есть ли способ настроить 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 ]

14 голосов
/ 27 ноября 2009

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

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

3 голосов
/ 26 февраля 2010

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

3 голосов
/ 27 ноября 2009

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

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

2 голосов
/ 27 ноября 2009

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

...