Как создать репозиторий, который будет содержать копии файлов из других репозиториев?

Как я могу включить два гит-репозитория в один гит-репозиторий и хранить их файлы вместо ссылок на подмодули, так чтобы при клонировании также загружались файлы из внутренних репозиториев?
Изображение к вопросу
  • 27 января 2024 г. 18:18
Ответы на вопрос 2
Чтобы создать репозиторий, который будет содержать копии файлов из других репозиториев без использования подмодулей Git, можно использовать подход слияния репозиториев, который включает следующие шаги:

1. Создайте новый главный репозиторий, который будет содержать файлы из других репозиториев.

```bash
git init combined-repo
cd combined-repo
```

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

```bash
git remote add repo1 <url_to_repo1>
git fetch repo1
git checkout -b repo1-branch repo1/main  # Может быть master вместо main
```

3. Перенесите файлы из первого репозитория в отдельную поддиректорию и сделайте коммит изменений.

```bash
mkdir repo1
git mv !(repo1) repo1
git commit -m "Перенёс файлы repo1 в отдельную директорию"
```

4. Вернитесь на основную ветку.

```bash
git checkout main
```

5. Слейте содержимое ветки с первым репозиторием в основную ветку с помощью `git merge`.

```bash
git merge repo1-branch --allow-unrelated-histories
```

6. Повторите шаги 2-5 для второго репозитория.

```bash
git remote add repo2 <url_to_repo2>
git fetch repo2
git checkout -b repo2-branch repo2/main  # Может быть master вместо main

mkdir repo2
git mv !(repo2) repo2
git commit -m "Перенёс файлы repo2 в отдельную директорию"
git checkout main
git merge repo2-branch --allow-unrelated-histories
```

7. В результате получится репозиторий, содержащий директории `repo1` и `repo2` с файлами из соответствующих репозиториев.

Учтите, что в командах `!(repo1)` и `!(repo2)` используется расширение командного интерпретатора для инвертирования выборки (т.е. выбрать все файлы и папки, кроме указанных после `!`). Для правильной работы этих команд убедитесь, что включено расширение globbing в вашей шелл-среде (в bash это `shopt -s extglob`).

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

```bash
git remote add origin <url_to_combined_repo>
git push -u origin main
```

Этот подход помогает объединить содержимое нескольких репозиториев в одном, отказавшись от использования подмодулей и записывая всю историю в одном месте, что упрощает клонирование и управление кодом.
Никак, только submodule, о чём вам и написал git
Похожие вопросы