Как переместить содержимое ветки в другой репозиторий, сохранив историю и не копируя полную историю оригинального репозитория? - PullRequest
1 голос
/ 14 апреля 2019

Я пытаюсь переместить некоторые файлы в отдельный репозиторий, сохраняя историю их изменений, и пытаюсь сэкономить дисковое пространство, поскольку исходный репозиторий занимает более 5 ГБ, но для нового требуется <50 МБ. </p>

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

git remote add originalreporemote **path**
git fetch originalreporemote 
git merge originalreporemote/branchwithfilestomove --allow-unrelated-histories
git remote rm originalreporemote

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

История файлов, которые я переместил в новый репозиторий, должна занимать гораздо меньше места.

UPD

Я понимаю, что может быть трудно понять проблему, поэтому вы можете выполнить шаги по ее воспроизведению:

Позвольте мнедобавьте несколько шагов, которые позволят вам легко воспроизвести проблему:

  1. Создайте два репозитория,
  2. Зафиксируйте текстовый файл в основной ветке repo1, так что потребуется несколько КБ,
  3. Создать новую ветку в repo1,
  4. Оформить заказ обратно в основную ветку repo1,
  5. Добавить несколько больших файлов в repo1 и передать их в мастер repo1.Таким образом, теперь repo1 содержит 2 ветви - основную ветвь с большими файлами и текстовым файлом и вторую ветвь из шага № 3 только с текстовым файлом,
  6. Попытайтесь вытолкнуть вторую ветку из шага № 3 изпервый репозиторий во второй репозиторий, сохраняющий историю его изменений (команды приведены выше),
  7. Я ожидаю, что после этой операции размер второго репозитория будет таким же, как и в шаге № 3, но вНа самом деле он равен размеру первого хранилища.

1 Ответ

0 голосов
/ 15 апреля 2019

Ваше упоминание о "нескольких больших файлах (например, mp3-файлах)" заставляет меня думать, что вы должны использовать Git LFS , хотя похоже, что вы этого не делаете сегодня. Это позволит вам сохранить всю историю Git, сохраняя при этом большие объекты за пределами Git, уменьшая размер хранилища:

Git Large File Storage (LFS) заменяет большие файлы, такие как аудиосэмплы, видео, наборы данных и графику, на текстовые указатели внутри Git, сохраняя содержимое файла на удаленном сервере, таком как GitHub.com или GitHub Enterprise.

Я думаю, что это более чистое решение, и оно поддерживается GitHub, GitLab и облачными предложениями Bitbucket, а также GitHub Enterprise и GitLab с автономным размещением, или вы можете настроить его самостоятельно .

Вкратце, для преобразования существующего хранилища:

  1. Установите клиент Git LFS для вашей операционной системы
  2. Включить LFS в вашем хранилище с помощью git lfs install
  3. Сообщите Git, какие файлы хранить в LFS, например запустив git lfs track '*.mp3'
  4. Добавить сгенерированный .gitattributes файл и зафиксировать
  5. Удалите и заново добавьте ваши MP3:

    git rm --cached *.mp3
    git add *.mp3
    git commit -m 'Move MP3s to Git LFS'
    
  6. Вам также придется переписывать историю, используя filter-branch, если вы хотите "сжать" старые коммиты

Это руководство , вероятно, стоит прочитать целиком.

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