Git: Как поддерживать две ветки проекта и объединять только общие данные?

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Я думаю, что у меня есть отдельная ветка для Windows и кода OS X, как вы сказали. Затем вы слейте изменение на cherry-picking код из другой ветки (синтаксис git cherry-pick refspec). Однако эти разработчики всегда должны следить за "изменением" на другой ветке os.

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