Оформить заказ из частного репозитория GitHub

Мне нужно клонировать частный репозиторий из GitHub, но я хочу получить только определенный тег (поэтому, по сути, клонирование на самом деле не подходит для этого термина).

Теперь проблема в том, что есть несколько вариантов, и все они на самом деле не работают:

  • GitHub предлагает теговые версии в виде архивов, но они не доступны через curl или же wget (по крайней мере, я не мог понять, как).
  • GitHub не поддерживает архивирование репозиториев.
  • Я мог бы запустить git clone а затем запустить git checkout чтобы добраться до версии, указанной тегом, но затем я загружаю больше, чем мне нужно, я нахожусь в отдельном состоянии, и все остальное содержимое остается на диске. Конечно, я мог бы убрать это вручную, но... ну, много работы для тривиальной задачи.

Каков наилучший способ достичь того, что я хочу сделать?

Обновить

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

3 ответа

Решение

Я думаю, что вы можете сделать это с git clone --single-branch:

       - [нет-] одной ветви
           Клонировать только историю, ведущую к вершине одной ветви, либо
           указывается параметром --branch или HEAD первичного удаленного филиала
           указывает на. При создании мелкого клона с опцией --depth это
           это значение по умолчанию, если только --no-single-branch не дано для извлечения
           истории около кончиков всех ветвей. Дальнейшие извлечения в
           Полученный репозиторий будет обновлять только ветку удаленного отслеживания для
           В ветви эта опция использовалась для начального клонирования. Если ГОЛОВА на
           remote не указывал ни на одну ветку, когда был создан клон --single-branch,
           ветка удаленного отслеживания не создается.

Обратите внимание, что это говорит о том, что вам нужно указать ветку --branch, а не тег. Тем не менее, документация для --branch говорит:

       --branch, -b 
           Вместо того, чтобы указывать вновь созданную ГОЛОВКУ на ветку, на которую указывает
           Заголовок клонированного хранилища, вместо этого укажите ветку. В
           репозиторий non-bare, это ветка, которая будет проверена.
           --branch также может взять теги и отсоединить HEAD при этом коммите в
           результирующий репозиторий.

Последнее предложение говорит, что вы можете использовать --branch с тегом. Единственное, в чем я не уверен, так это в том, --single-branch и передать тег --branch, Я думаю, вам придется попробовать это, чтобы подтвердить. В качестве альтернативы вам придется создать ветку в удаленном хранилище, а не тег.

Обновить

Теперь вы говорите, что вы также хотите уничтожить всю историю. Сделай это потом.

Два пути:

Жить опасно:

git clean -xdf  # Clean out everything not in git
rm -rf .git     # remove git
git init .      # put it back
git add .       # Add all the files
git commit -a -m "Eternal sunshine of the spotless mind"

Жизнь менее опасно

git rebase --root -i # needs recent version of git

затем измените каждую строку для начала s раздавить в первоначальный коммит.

Также смотрите Как раздавить все git коммиты в один?

git fetch --all --prune обновит ваш локальный репозиторий всеми последними ветками и тегами, как только вы получите их локально, вы можете просто проверить их.

После получения вы можете перечислить теги с git tag -l и затем git checkout для определенного тега: git checkout tags/<tag_name>

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

Вы должны иметь в виду, что в git есть 2 типа тегов:

  • обычный тег ("настоящий" git commit)
  • аннотированный тег (перемещаемый SHA-1 для любого коммита, на котором вы хотите его использовать)

Так что, если вы извлекаете аннотированный тег сегодня, это не значит, что если вы извлекаете тег сейчас, это будет тот же коммит позже. имейте это в виду

Если вы хотите клонировать кончик тега (только последний коммит)

git clone <repo_url> --branch <tag_name> --depth=1

Замечания: git clone --single-branch --branch tag может работать, но.. забудьте промежуточные теги в случае цепочки тегов!

См. Коммит b773dde, коммит ab51783, коммит 948a7fd, коммит 2076353, коммит 1962d9f (07 сентября 2016 г.) Джеффом Кингом ( peff )
(Объединено Юнио С Хамано - gitster - в коммите 9883ec2, 15 сентября 2016 г.)

pack-objects: цепочки тегов ходьбы для --include-tag

" git pack-objects --include-tag "Учили, что, когда мы знаем, что мы отправляем объект C мы хотим тег B это прямо указывает на C но и тег A это указывает на тег B,
Раньше мы пропускали промежуточный тег B в некоторых случаях.

Что произойдет, если у нас есть цепочка тегов (например, тег " A "указывает на тег" B ", который указывает на совершение" C ")?

Мы будем очищать " C "и понять, что мы хотим включить тег" A ", но мы никогда не рассматриваем тег" B ", приводя к сломанной пачке (при условии" B "не было выбрано иначе).

Это исправлено в Git 2.11 (4 квартал 2016 г.)

Другие вопросы по тегам