Я начал проект несколько месяцев назад и сохранил все в основном каталоге. В моем основном каталоге "Project" есть несколько подкаталогов, содержащих разные вещи: Project / paper содержит документ, написанный в LaTeX. Project / sourcecode / RailsApp содержит мое приложение rails.
«Project» - это GITified, и было много коммитов как в «paper», так и в «RailsApp». Теперь, поскольку я хотел бы использовать cruisecontrol.rb для своего «RailsApp», мне интересно, есть ли способ сделать из «RailsApp» подмодуль без потери истории.
Ответы:
В настоящее время есть гораздо более простой способ сделать это, чем вручную использовать git filter-branch: git subtree
Монтаж
ПРИМЕЧАНИЕ
git-subtree
теперь является частьюgit
(если вы устанавливаете contrib) начиная с версии 1.7.11, так что, возможно, он у вас уже установлен. Вы можете проверить, выполнивgit subtree
.Чтобы установить git-subtree из исходного кода (для более старых версий git):
Или, если вам нужны страницы руководства и все
использование
Разделите больший на более мелкие части:
Для получения подробной документации (справочная страница), пожалуйста, прочтите
git-subtree.txt
.источник
git rm -rf ./foo
удаляетfoo
из ,HEAD
но не фильтруетmy-project
«s полная история. Затемgit submodule add git@github.com:my-user/new-project.git foo
создает толькоfoo
подмодуль, начиная сHEAD
. В этом отношении сценарийfilter-branch
лучше, поскольку он позволяет добиться «как если бы subdir был подмодулем с самого начала»Оформить заказ git filter-branch .
В
Examples
разделе справочной страницы показано, как извлечь подкаталог в собственный проект, сохраняя при этом всю его историю и отбрасывая историю других файлов / каталогов (именно то, что вы ищете).источник
Один из способов сделать это - удалить все, кроме файла, который вы хотите сохранить.
По сути, сделайте копию репозитория, а затем
git filter-branch
удалите все, кроме файлов / папок, которые вы хотите сохранить.Например, у меня есть проект, из которого я хочу извлечь файл
tvnamer.py
в новый репозиторий:Это используется
git filter-branch --tree-filter
для прохождения каждой фиксации, запуска команды и повторного подтверждения полученного содержимого каталогов. Это чрезвычайно разрушительно (поэтому вы должны делать это только с копией своего репозитория!) И может занять некоторое время (около 1 минуты для репозитория с 300 коммитами и примерно 20 файлами).Приведенная выше команда просто запускает следующий сценарий оболочки для каждой ревизии, который вам, конечно же, придется изменить (чтобы он исключал ваш подкаталог вместо
tvnamer.py
):Самая большая очевидная проблема заключается в том, что он оставляет все сообщения фиксации, даже если они не связаны с оставшимся файлом. Скрипт git-remove-empty-commits исправляет это ..
Вам нужно снова
-f
запустить аргумент forcefilter-branch
с чем-либоrefs/original/
(что в основном резервное копирование)Конечно, это никогда не будет идеальным, например, если в ваших сообщениях о фиксации упоминаются другие файлы, но это примерно настолько близко, насколько позволяет текущий git (насколько мне известно).
Опять же, запускайте это только на копии вашего репозитория! - но в целом, чтобы удалить все файлы, кроме thisismyfilename.txt:
источник
git filter-branch
имеет (в настоящее время?) встроенную опцию для удаления пустых коммитов, а именно--prune-empty
. Лучшее руководствоgit filter-branch
- в ответах на этот вопрос: stackoverflow.com/questions/359424/…Оба CoolAJ86 и apenwarr ответы очень похожи. Я ходил туда и обратно между двумя, пытаясь понять биты, которые отсутствовали в любом из них. Ниже представлена их комбинация.
Сначала перейдите в Git Bash в корень репозитория git, который нужно разделить. В моем примере это
~/Documents/OriginalRepo (master)
Ниже приведена копия вышеизложенного с замененными настраиваемыми именами и использованием вместо этого https. Корневая папка теперь
~/Documents/_Shawn/UnityProjects/SoProject (master)
источник
Если вы хотите перенести какое-то подмножество файлов в новый репозиторий, но сохранить историю, вы, в основном, получите совершенно новую историю. В основном это будет работать следующим образом:
Это должно быть довольно просто автоматизировать, если вы не против написать небольшой, но сложный сценарий. Прямолинейно, да, но также и болезненно. В прошлом люди переписывали историю в Git, вы можете поискать это.
В качестве альтернативы: клонируйте репозиторий и удалите документ в клоне, удалите приложение в оригинале. Это займет одну минуту, это гарантированно сработает, и вы сможете вернуться к более важным вещам, чем попытки очистить историю git. И не беспокойтесь о пространстве на жестком диске, занятом избыточными копиями истории.
источник