Обмен файлами между ветками в Git
в моем проекте есть куча файлов, которые иногда изменяются, но всегда разделяются между многими различными ветвями. Примеры включают в скрипты сборки, пакетные файлы, которые включают путей и т. д. Даже .сам файл пример пример.
Я хочу, чтобы этот материал в системе управления версиями, но я не хочу, чтобы отдельные ветви отслеживали изменения в них.
Как вы справляетесь с этой ситуацией?
вы отслеживаете все, что связано с вашим проектом в Git? Каков ваш подход к общим объектам?
есть .gitignore мой единственный вариант?
6 ответов
вместо того, чтобы полагаться на подмодули, ты не думал о git-поддерево?
Как говорится в документация:
поддеревья не следует путать с подмодули, которые предназначены для та же задача.
в отличие от подмодулей, поддеревья не нужны никакие специальные конструкции (любить. файлы gitmodule или gitlinks) быть присутствует в вашем репозитории и не заставить конечных пользователей вашего репозитория делать что-нибудь особенное или понять как работают поддеревья.
поддерево-это просто подкаталог, который может быть, разветвленный, и слитый вместе с вашим проект в любом случае вы хотите.
Ниже приведены некоторые сообщения, дающие некоторые отзывы и объясняющие плюсы поддеревьев подмодули:
- http://ayende.com/Blog/archive/2011/01/10/the-problem-with-git-submodules.aspx
- http://ayende.com/Blog/archive/2011/01/10/git-subtree.aspx
- http://hobocentral.net/blog/2010/07/28/git-subtree/
- http://h2ik.co/2011/03/having-fun-with-git-subtree/
очень интересная (и несколько нагретая) нить, от git рассылка, обсуждение плюсов и минусов git-поддерева и подмодуля
другие ответы не рассматривали мою проблему так чисто, как мне хотелось бы, но они подтолкнули меня к исследованию большего количества вариантов.
во-первых, git не имеет концепции отслеживания отдельных файлов, только целых репозиториев и ветвей.
нет встроенного способа выбора набора файлов, которые должны поддерживаться в системе управления версиями и управляться независимо от других отдельных ветвей.
в моем проекте, практически все общие файлы в одном конкретный подкаталог. В то время как остальная часть исходного дерева может изменяться и должна управляться отдельными ветвями, этот "конфигурационный" набор файлов может быть разделен между различными ветвями, чтобы сохранить репозиторий в "живом" состоянии.
Я не мог найти решение, потому что я не читал книг о git, и я не знал правильного поискового термина. Решение Git для этой ситуации субмодуль.
Если вместо этого моя информация о конфигурации была распространена среди отдельные файлы, которые не содержатся в отдельном каталоге, подмодуль не подходит.
в этом случае a удаленный репозиторий git должен быть настроен, и файлы будут поддерживаться в отдельном репозитории с помощью git-push.
для простых систем я создам базовые версии этих файлов, которые находятся в управлении версиями, которые затем адаптируются для каждого экземпляра, файлы для которых находятся .гитюдного.
Если я использую более сложную цепочку инструментов, я создам исходные XML-файлы, которые описывают базовые части, XML-файлы, которые описывают конкретные варианты экземпляра, а затем запустите XSLT с помощью свойства профиля или командной строки для создания локально подходящих версий в рамках сборки конфигурация / сценарий в зависимости от вашего яда. Это не обязательно XML/XSL, я просто много работаю с XML, вы можете использовать любую систему munging, которая работает с вашей средой сборки, скажем, текстовые файлы со скриптами perl или просто sed / awk.
вы можете достичь того же эффекта, что и .gitignore файлы, установив пропустить-worktree бит отслеживаемых файлов.
git update-index --skip-worktree <path_to_file>
Git теперь будет притворяться, что ваши файлы обновлены.
Я бы создал одну ветку, чтобы включить все эти общие файлы. Всякий раз, когда ветви нужен общий файл, он может получить его с помощью
git checkout workingbranch
git checkout sharedbranch <needed file>
позже можно обновить, просто с помощью той же команды
git checkout sharedbranch <needed file>