Доброго дня всем!
В Сети много ссылок на настройку GIT, как локально, так и с онлайн-хранилищами. Но я нигде не нашёл рекомендаций по правильной организации такого хранилища. Итак, имеем небольшую (3-5 человек) команду разработчиков (на C++/Qt). На компьютерах настроена переменная окружения (например, prog_root), внутри которой есть:
Папки разработчиков (bill,bob,john), внутри которых каждый разработчик хранит свои программы (папка разработчика является корневой для проектов Qt Creator).
Папка include, в которой хранятся заголовочные файлы (и .cpp) для совместно используемых программных модулей. Внутри неё тоже есть папки (common, math, exceptions etc.), в которых хранятся <библиотеки>, относящиеся к соответствующей предметной области.
Папка lib, в которую складываются сгенерированные статические библиотеки.
Папка build, в которой генерятся исполняемые файлы.
Папка doc, в которой хранится документация
Прочее.
Каждый разработчик пишет как отдельные программы (обменивающиеся информацией по TCP/IP, через разделяемую память, через перенаправление потоков ввода-вывода или ещё как), так и библиотеки, используемые другими программистами. Исходники библиотек хранятся в include и могут включаться в несколько проектов сразу.
В настоящее время обмен свежими версиями происходит так: выпустив важное изменение и отладив на своей машине, разработчик говорит остальным: "заберите у меня такой-то файл", те забирают и копируют на свои машины. Иногда, когда отладка возможна только на специфических данных или оборудовании, доступных только на объекте, разработчик едет на объект, отлаживается и привозит обратно отлаженную версию, которую раскидывает себе и предлагает забрать другим разработчикам. Синхронизация версий, например, на рабочем компе и на ноутбуке (поработать на дому) осуществляется собственными силами, нецентрализованно. Разработка кросплатформенная, поэтому у некоторых разработчиков есть копии prog_root под Windows, Linux и QNX.
Соответственно, есть желание настроить GIT для того, чтобы свести "размазанную по компьютерам разработчиков" актуальную версию в единое хранилище. Что включать в проект GIT? Если делать по отдельному проекту на программу, библиотеки будут дублироваться, и при переключении на другой проект можно "засосать" устаревшую версию, выложенную при очередном коммите другим разработчиком. Если по проекту GIT на смысловую единицу, то в одну программу будет входить несколько GIT-проектов. Это правильно? Или надо вообще объединить всё в единой единице GIT?
Если такая тема где-то уже поднималась, буду рад ссылочке. Если нет - рекомендациям по организации хранилища.
Ответ
Как обычно делают. На каждый проект делается свой проект. Для библиотек - свой. Потом библиотеки подключаются как подмодули к основным проектам. Почему так? Очень часто бывает, что один разработчик пилит библиотеку, а другой использует. И вот разработчик библиотки запилил новый, красивый интерфейс, но сильно не совместимый с старым (это может быть по разному, к примеру, использовалась библиотека не совсем правильно, недокументировано, а в новой версии это прикрыли). Или другой случай, новая библиотека вышла, проекты подтянули для них и через месяц забыли. А потом оказалось, что нужно посмотреть старый-старый код. И что, гадать, какие версии библиотек использовались?
Подмодули позволяют коммитить в основной проект версию вложенных проектов и все будет красиво. Более того, разные разработчики могут использовать разные версии (коммиты) библиотеки. В Вашем случае наверное вначале можно сделать просто один подпроект - библиотека, а потом, по мере надобности разделять.
Теперь дальше. Для удобной работы с кодом, лучше завести github или bitbucket. Последний хорош тем, что позволяет делать приватные репозитории для небольших групп бесплатно. Если код очень сильно секретный и выложить во внешний мир никак нельзя - поставьте себе личный сервер в офис с установленным gitlab. В интернете гуглиться много готовых инструкций, вот к примеру для ubuntu + gitlab
Что хранить в репозиториях. Тут ответ очень прост. Новый разработчик (или старый, который потерял свой комп) должен установить инструменты (компиляторы, ide, git), потом слить репозиторий и начать работать.
Отсюда вывод - в репозитории не нужно хранить всякие *.o, *.bak или другие бинарники, которые и так можно сгенерировать. Если наличие некоторых бинарников жизненно важно для начала работы и они могут быть скомпилированы - просто добавьте батник/bash файл/perl/python файл который все сам соберет.
Также многие не рекомендуют включать в репозиторий конфиги среды разработки. Они у каждого свои. Но можно добавить "дефолтные" и обновлять их только по общему согласию.