Контроль версий для одного файла в нескольких каталогах, предотвращение конфликтов с существующими репозиториями Git - PullRequest
0 голосов
/ 18 мая 2018

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

Файл стилей и контрольные примеры имеют отдельные репозитории на Git:

  • Git-репозиторий 1: style, то есть файл стилей.
  • Git-репозиторий 2: examples, то есть контрольные примеры.
    • /A: один из тестовых случаев и копия style
    • /B: другой тестовый случай и копия style

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

В настоящее время я синхронизирую каждый файл стиля вручную, но хотел бы сделать это с поддержкой какого-либо инструмента diff / versioning.

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

  • Mercurial repo 1: style file

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

Вопрос : как я могу управлять версиями одного файла в каталоге, где я уже использую git для другого хранилища?

(Я приму конструктивный ответ «вы все делаете неправильно - попробуйте») с благодарностью!)

1 Ответ

0 голосов
/ 19 мая 2018

Хорошо, чтобы проверить мое понимание:

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

Если бы это был скомпилированный код, он был бы совершенно обычным: соберите и протестируйте свою утилиту, отправьтепродукт, производственные пользователи используют поставляемую библиотеку, или, если они в нее входят, создайте ее сами как подмодуль и отправляйте или переносите исправления.

Когда нет этапа компиляции и сборки, особенно когдаполезная нагрузка - это отдельный файл, как здесь, границы начинают немного раздражать, естественное желание - «я не могу просто получить один файл?».

Да?Предполагая, что я подобрался достаточно близко, чтобы работать с:


Важно понимать, что единственная действительно важная структура в Git - это родословная связь.Любой репозиторий может содержать любое количество различных историй.

В частности, люди, использующие вашу библиотеку стилей, могут вносить ваши опубликованные истории и работать с ними так, как им нравится.

Все пользователи:

git remote add acstyle u://r/l
git fetch acstyle

just-gimme-пользователи the-content могут затем сделать

git checkout acstyle/payload -- .

, и теперь их извлечение имеет самую последнюю полезную нагрузку.

Пользователи, более знакомые с Git, могут захотеть, чтобы он вел записи для них, они могут

git merge acstyle/payload    # initially with `--allow-unrelated-histories`

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

Вы можете предложить несколько веток в опубликованном репо и, например, объединить пустую полезную нагрузку с тестовыми сценариями / примерами сценариев.Это легко сделать.

Допустим, у вас есть "основная" ветка разработки со всеми вашими тестовыми примерами и примерами, но вы хотите создать ветки полезной нагрузки, как описано выше, которые не будут засорять репозитории других людей.

Начальное построение минимальной ветви payload:

# from any clean checkout
git checkout --orphan payload
git reset --hard
git checkout master -- acstyle.sty
git commit -m "acstyle-payload-v1.0"

Когда пришло время опубликовать новую версию полезной нагрузки, сделайте это снова, но пропустите потерянные биты и биты сброса, или опубликуйте полную историюза подсказкой, так что она есть, но не засоряет оформление заказа, вы можете сделать

git checkout payload
git merge -s ours --no-commit master    # add `--allow-unrelated-histories` the first time
git checkout master -- acstyle.sty      
git commit -m "acstyle-payload-v1.1"

Я не знаю, как предсказать, понравится ли пользователям полная история разработки за -s ours, объединить этоТаким образом, поддерживать и то, и другое легко.

Вы можете поддерживать ветки «полезная нагрузка плюс примеры» и любые другие варианты, которые кажутся вам одинаковыми, пользователи просто выбирают то, что хотят, и объединяют его в свою собственную историю.

Если вы идете по этому пути, не используйте теги в опубликованном репозитории, Git по умолчанию копирует все теги из каждого репоистория, из которой они извлекаются, и они засоряют историю ваших пользователей.Вместо этого, просто используйте сообщения фиксации, пользователи могут использовать синтаксис :/ для ссылки на коммиты по содержимому сообщения, если они хотят что-то отличное от самого последнего,

git checkout :/^acstyle-payload-v0.9a -- acstyle.sty

, и они могут видеть журнал опубликованныхверсии с

git log --oneline ---first-parent acstyle/payload
...