Public / Private git репозитории с другой историей коммитов - PullRequest
2 голосов
/ 21 мая 2019

Я пытаюсь управлять проектом с открытым исходным кодом на GitHub с помощью гибридного открытого и частного рабочего процесса, аналогичного описанному здесь: https://stackoverflow.com/a/30352360/204023

По сути, это описывает процесс, в котором есть два репозитория, которые отражают друг друга, без отношения fork GitHub. Это позволяет вам использовать стандартные удаленные репозитории git для отправки / извлечения изменений между ветвями, а также публичные запросы GitHub для объединения частных изменений в основную ветку. Именно то, что я пытаюсь достичь.

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

Инициализация нового проекта с --depth 1 оказывается недопустимой, вы не можете инициализировать новый репо с мелким клоном: ! [remote rejected] master -> master (shallow update not allowed)

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

1 Ответ

3 голосов
/ 21 мая 2019

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

Поскольку хэш-идентификатор каждого коммита является криптографической контрольной суммой содержимого этого коммита, включая родительский хэш, хэш-идентификатор последнего коммита зависит от хеш-идентификаторов каждого коммита в истории, сформированного, идя назад от этого коммита через любой другой достижимый коммит. (С технической точки зрения это форма дерево Меркле .)

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

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