У меня есть веб-приложение, которое исследует другие веб-приложения определенным образом. Он содержит несколько веб-демонстраций в demos
папке, и одна из демонстраций теперь должна иметь собственный репозиторий. Я хотел бы создать отдельный репозиторий для этого демонстрационного приложения и сделать егоподпакет подмодуль из основного репозитория без потери истории коммитов.
Можно ли сохранить историю коммитов из файлов в папке репозитория и создать из него репозиторий и вместо этого использовать его как подмодуль ?
git
git-submodules
revision-history
ГабЛеРу
источник
источник
Ответы:
Подробное решение
В следующем ответе вы узнаете, как извлечь папку из репозитория и создать из нее репозиторий git, а затем включить его в качестве подмодуля вместо папки.
На основе статьи Герга Байера « Перемещение файлов из одного репозитория Git в другой с сохранением истории»
Вначале у нас есть что-то вроде этого:
В указанные ниже шаги, я буду называть это
someLib
так<directory 1>
.В итоге у нас будет что-то вроде этого:
Создайте новый репозиторий git из папки в другом репозитории
Шаг 1
Получите новую копию репозитория для разделения.
Шаг 2
Текущая папка будет новым репозиторием, поэтому удалите текущий пульт.
Шаг 3
Извлечь историю желаемой папки и зафиксировать ее
Теперь у вас должен быть репозиторий git с файлами из
directory 1
корня вашего репо со всей связанной историей фиксации.Шаг 4
Создайте свой онлайн-репозиторий и продвигайте новый репозиторий!
Возможно, вам потребуется установить
upstream
ветку для вашего первого нажатияЧистый
<git repository A>
(необязательно, см. Комментарии)Мы хотим удалить следы (файлы и историю фиксации)
<git repository B>
из,<git repository A>
чтобы история для этой папки была только один раз.Это основано на удалении конфиденциальных данных из github.
Перейдите в новую папку и
Замените
<directory 1>
папкой, которую хотите удалить.-r
будет делать это рекурсивно внутри указанного каталога :). Теперь нажмите наorigin/master
с--force
Уровень босса (см. Примечание ниже)
Создать подмодуль из
<git repository B>
в<git repository A>
Убедитесь, что все работает должным образом, и
push
Заметка
После всего этого я понял, что в моем случае более целесообразно использовать npm для управления моими собственными зависимостями. Мы можем указать URL-адреса и версии git, см. URL-адреса git package.json как зависимости .
Если вы делаете это таким образом, хранилище вы хотите использовать в качестве требования должно быть модулем НПМ , поэтому он должен содержать
package.json
файл , или вы получите эту ошибку:Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.tldr (альтернативное решение)
Возможно, вам будет проще использовать npm и управлять зависимостями с помощью URL-адресов git :
npm init
в обоих репозиторияхnpm install --save git://github.com/user/project.git#commit-ish
там, где вы хотите, чтобы ваши зависимости были установленыисточник
cd someLib
до шага 2? Вы говорите: «Текущая папка будет новым репозиторием», но на самом деле это не так; новый репозиторий (подмодуль) находится внутри этой папки.refs/original/...
что создается на шаге 3.Решение @GabLeRoux сжимает ветки и связанные с ними коммиты.
Простой способ клонировать и сохранить все эти дополнительные ветки и коммиты:
1 - Убедитесь, что у вас есть этот псевдоним git
2 - Клонируйте пульт, вытяните все ветки, смените пульт, отфильтруйте каталог, нажмите
источник
Решение GabLeRoux работает хорошо, за исключением случаев, когда вы используете
git lfs
большие файлы в каталоге, который хотите отсоединить. В этом случае после шага 3 все большие файлы останутся файлами-указателями, а не настоящими файлами. Я думаю, это, вероятно, из-за того, что.gitattributes
файл был удален в процессе ветки фильтра.Понимая это, я считаю, что для меня работает следующее решение:
Копирование того,
.gitattributes
что git lfs использует для отслеживания больших файлов в.git/
каталог, чтобы избежать их удаления.Когда filter-branch завершено, не забудьте вернуть,
.gitattributes
если вы все еще хотите использовать git lfs для нового репозитория:источник