Получение единой ревизии от Git

14

Наличие полной истории изменений Git имеет много преимуществ как часть процесса разработки.

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

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

Есть ли способ получить единственную ревизию от Git без его истории?

RSF
источник
1
Соответствующие вопросы и ответы на SO stackoverflow.com/questions/26135216/…
Евгений

Ответы:

16

Мелкий клон

Вы действительно можете получить мелкий клон из Git, используя:

git clone --depth=1 <url>

Это все равно клонирует репо и создаст .gitпапку с объектами, только меньшего размера (разница зависит от вашего общего размера файла и размера истории).

Git архив

Вы также можете использовать git-archive для распаковки архива репо:

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

В примерах это показывает, например:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

Создайте сжатый архив для выпуска .

Hosted Git, архив API

Если вы размещаете репо на GitHub, то вы можете использовать их архивный API :

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

Bitbucket.org имеет такую ​​же функциональность для этого:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip

7ochem
источник
7очем, может команда gzip должна быть gzip -c ....
Ромео Нинов
11

Не используйте ваш репозиторий Git. Разработайте реальную методологию развертывания. Даже если это так же просто, как собрать архив (= создать артефакт с необходимыми файлами для развертывания) развернутых сценариев.

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

Примечание : для репозиториев скриптовых языков, которые на самом деле не имеют шага «сборки», тривиальным способом освобождения артефакта будет упаковка их в архив, такой как tar или rpm. Затем, чтобы «развернуть», вы распаковываете архив или устанавливаете rpm. это устраняет необходимость использования инструментов git в вашей цепочке развертывания (не все серверы prod будут иметь эти инструменты разработки).

RubyTuesdayDONO
источник
можно задавать вопросы (или даже оспаривать!) ответ - это то, что делает Stack Exchange великолепным :) для репозиториев скриптовых языков, у которых на самом деле нет этапа «сборки», тривиальным способом выпустить артефакт будет пакет их в архиве, таких как tar или rpm. затем, чтобы «развернуть», вы распаковываете архив или устанавливаете rpm. это устраняет необходимость использования инструментов git в вашей цепочке развертывания (не все серверы prod будут иметь такие инструменты разработки)
RubyTuesdayDONO
1
@ Pierre.Vriens да, вам не хватает того, что предлагается в качестве архивирования архива, т. Е. Создание артефакта с необходимыми файлами для развертывания. Тем не менее, я согласен, что это не качественный ответ, и этот пункт должен быть расширен. Мы находимся в частной бете и ответы должны урожденная Явный
Tensibai
Тогда я не вижу, что это дает больше, чем принятый ответ, если он указывает на подходящий архив ... это просто избыточно, вам нужно отредактировать, чтобы расширить этот путь iMHo
Tensibai
1
Пожалуйста, проверьте мою правку вашего ответа (только что включил ваш интересный комментарий). Не стесняйтесь улучшать / переделывать, конечно, или просто откат, если вам совсем не нравится мое редактирование. Кстати: ваш комментарий (= примечание, которое я добавил) заставил меня задуматься, как "на самом деле, это так просто? Опять пример того, как мы добиваемся цели в zOS ... с z для нулевого времени простоя ...". Я думаю, что пришло время начать задавать больше вопросов / ответов с помощью похожих комментариев ... Не
бросайте
я не утверждаю, что это полный или модельный ответ, но я не видел, чтобы кто-то еще обращался к слону в комнате: если вы используете git для «развертывания» своего проекта, у вас «будет плохое время» ;)
RubyTuesdayDONO
6

Вопрос: есть ли способ получить единственную ревизию от Git без его истории?

Чтобы получить репозиторий, нет, нет никакого способа, главным образом потому, что нет «ревизии». Git Store фиксирует, которые являются изменениями из предыдущего состояния.
Если вы хотите, чтобы ваш репозиторий находился в определенный момент времени, вы должны извлечь коммит в это время и всех его предков, иначе вы получите только изменения, сделанные в коммите.

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

Для решений @ 7ochem answer охватывает их.

Tensibai
источник