Как добавить тысячи локальных релизов в GitHub?

#git #github

#git #github

Вопрос:

У меня есть папка, содержащая несколько тысяч выпусков кода, каждый выпуск в своей подпапке. Тем не менее, мне нужно начать использовать GitHub, но я хочу, чтобы вся моя коллекция релизов кода была добавлена на GitHub в раздел «релизы». Какой самый простой способ сделать это?

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

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

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

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

Итак, у меня на моем компьютере тысячи папок с выпусками. Как я могу загрузить все это в свой репозиторий на GitHub без использования импорта и без ручной фиксации каждого из них по отдельности? Я просто хочу, чтобы все они были доступны в категориях Releases / Tags на GitHub, но их слишком много, чтобы вручную фиксировать каждый из них.

Комментарии:

1. Для такого рода вещей вы обычно создаете репозиторий локально: копируете файлы из одного выпуска, добавляете их в репозиторий, помечаете его, затем продолжаете делать то же самое со следующим выпуском, и так для всех ваших папок с релизами. Когда вы закончите, перенесите все на github.

2. Не могли бы вы подробнее рассказать о «копировании файлов из одного выпуска, добавлении их в репозиторий»? Что вы подразумеваете под копированием, куда мне копировать файлы, и вы имеете в виду обычное копирование файлов или использование команд Git? И как мне добавить эти файлы? Я довольно новичок в Git.

3. Это звучит как идеальная работа для написания сценария. Вероятно, вы могли бы использовать эту git fast-import функцию для быстрого преобразования ваших папок в репозиторий git с историей. Или просто создайте сценарий логики коммита Git самостоятельно. Затем используйте немного сценариев для создания тегов на основе имен папок. Вы можете использовать gh release create из проекта командной строки github ( cli.github.com ) для создания релизов после нажатия кнопки.

Ответ №1:

Я предполагаю, что у вас есть папка с выпусками, которая выглядит примерно так:

 myproject-1.0/
myproject-1.1/
myproject-2.0/
 

и так далее. Вы хотели бы импортировать их в репозиторий git. Мы начинаем с создания пустого репозитория git:

 git init myproject
 

Это создаст каталог с именем myproject , содержащий пустой репозиторий git. Измените каталог на этот каталог:

 cd myproject
 

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

  1. Скопируйте все файлы из релиза в репозиторий:
     cp -a ../${release}/* .
     
  2. Добавьте файлы в репозиторий:
     git add .
     
  3. Зафиксируйте файлы:
     git commit -m "imported release $release"
     
  4. (Необязательно) пометьте фиксацию:
     git tag $release
     

    Или чтобы превратить тег в выпуск GitHub, создайте аннотированный тег:

     git tag -a -m "imported $release" $release
     

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


Чтобы создать прототип этого, я собрал все выпуски проекта GNU hello и поместил их в каталог; это означает, что я начал с этого:

 $ ls
hello-1.3    hello-2.1.1  hello-2.4  hello-2.7
hello-2.1.0  hello-2.2    hello-2.5  hello-2.8
hello-2.10   hello-2.3    hello-2.6  hello-2.9
 

Я написал следующий скрипт для выполнения импорта:

 #!/bin/bash

if [ ! -d hello-repo ]; then
    git init hello-repo
fi

# change directory into the repository
cd hello-repo

# iterate over the releases in version order
ls -d ../hello-[0-9]* | sort --version-sort -t- -k2,2 |
while read path; do
  release="${path##*/}"
  echo "importing release: $release"

  rm -rf *
  cp -a $path/* .
  git add .
  git commit -m "imported release $release"
  git tag -a -m "imported $release" "$release"
done
 

Обратите внимание, что я использую sort --version-sort ... , чтобы убедиться, что каталоги перечислены в правильном порядке; без этого лексическая сортировка этих каталогов будет выполняться hello-2.10 сразу после hello-2.1.0 .

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

Поскольку я создал аннотированные теги ( git tag -a ... ), каждый тег был автоматически преобразован в выпуск GitHub (см. Здесь ).