Git: Как сохранить две ветви проекта и объединить только общие данные? - PullRequest
3 голосов
/ 10 января 2009

Предположим, у меня есть две ветви проекта IMClient-MacOS и IMClient-Windows, и их код отличается только (скажем, на один каталог main /). Все остальные каталоги содержат системно-независимый код и являются взаимозаменяемыми.

Некоторые работники работают над версией Windows, а некоторые - над версией MacOS. Как они предотвращают перезапись, изменяющуюся в основной каталог /, когда они объединяются из ветви своих коллег? Есть ли способ слияния в Git, который всегда игнорирует OS-зависимый каталог?

Ответы [ 4 ]

7 голосов
/ 10 января 2009

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

6 голосов
/ 11 января 2009

Не используйте только одну ветку на платформу (Windows и Mac).

Вместо этого имейте как минимум три ветви: Generic, Windows и Mac. Универсальная ветвь не имеет системно-зависимого кода, а ветвь платформы не имеет универсального кода, поэтому ни одна из ветвей не будет создаваться сама по себе. Вместо этого разработчик Mac всегда создает одноразовую ветвь, которая представляет собой слияние между generic и mac для сборки.

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

Еще лучше было бы иметь одну кодовую базу, которая будет собираться на обеих платформах системой сборки (переменные make-файла и условная компиляция). Затем разработчик Mac добавит общую функцию и код поддержки платформы для новой функции только для Mac, добавляя нерабочий заглушку для других платформ, и передаст результат разработчикам на других платформах для заполнения заглушек.

2 голосов
/ 10 января 2009

Альтернативой попытке фильтрации слияний может быть разделение общей и специфичной для ОС частей на два репозитория. Затем вы можете настроить один как подмодуль для другого. Независимо от того, настроена ли общая часть как подмодуль определенных частей ОС, или наоборот, возможно, немного зависит от того, куда делится большинство коммитов.

1 голос
/ 10 января 2009

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

Как вы сказали, у меня есть отдельная ветка для кода Windows и OS X. Затем вы объедините изменения с помощью cherry-picking кода из другой ветви (синтаксис git cherry-pick refspec). Однако разработчики должны всегда следить за «изменениями» в ветви другой операционной системы.

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

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