#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
Теперь, чтобы импортировать ваши релизы, нам нужно перебрать ваши релизы по порядку и для каждого выпуска выполнить следующие действия.
- Скопируйте все файлы из релиза в репозиторий:
cp -a ../${release}/* .
- Добавьте файлы в репозиторий:
git add .
- Зафиксируйте файлы:
git commit -m "imported release $release"
- (Необязательно) пометьте фиксацию:
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 (см. Здесь ).