Этот вопрос основан на подкаталоге Отсоединения в отдельный репозиторий Мерзавца
Вместо того, чтобы отсоединить единственный подкаталог, я хочу отсоединить пару. Например, мое дерево текущего каталога похоже на это:
/apps
/AAA
/BBB
/CCC
/libs
/XXX
/YYY
/ZZZ
И я хотел бы это вместо этого:
/apps
/AAA
/libs
/XXX
--subdirectory-filter
аргумент git filter-branch
не будет работать, потому что это избавляется от всего за исключением данного каталога в первый раз, когда это выполняется. Я думал с помощью --index-filter
аргумент в пользу всех нежелательных файлов работал бы (хотя утомительный), но если я пытаюсь выполнить его несколько раз, я получаю следующее сообщение:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
Какие-либо идеи? TIA
Отвечая на свой вопрос здесь ... после множества проб и ошибок.
Мне удалось это сделать, используя комбинацию git subtree
и git-stitch-repo
. Эти инструкции основаны на:
Сначала я вытащил каталоги, которые хотел сохранить в отдельном репозитории:
cd origRepo
git subtree split -P apps/AAA -b aaa
git subtree split -P libs/XXX -b xxx
cd ..
mkdir aaaRepo
cd aaaRepo
git init
git fetch ../origRepo aaa
git checkout -b master FETCH_HEAD
cd ..
mkdir xxxRepo
cd xxxRepo
git init
git fetch ../origRepo xxx
git checkout -b master FETCH_HEAD
Затем я создал новый пустой репозиторий и импортировал / вшил в него два последних:
cd ..
mkdir newRepo
cd newRepo
git init
git-stitch-repo ../aaaRepo:apps/AAA ../xxxRepo:libs/XXX | git fast-import
Это создает две ветки, master-A
и master-B
, каждый из которых содержит содержимое одного из сшитых репозиториев.Чтобы объединить их и очистить:
git checkout master-A
git pull . master-B
git checkout master
git branch -d master-A
git branch -d master-B
Теперь я не совсем уверен, как и когда это произойдет, но после первого извлечения
и извлечения
код волшебным образом сливается с master ветка (приветствуется любое понимание того, что здесь происходит!)
Кажется, все работает, как и ожидалось, за исключением того, что если я просматриваю историю фиксации newRepo
, есть дубликаты, когда набор изменений затрагивал оба приложения / AAA
и библиотеки / XXX
. Если есть способ удалить дубликаты, то это было бы идеально.
Ага. Принудительно перезаписать резервную копию с помощью флага -f
при последующих вызовах filter-branch
, чтобы отменить это предупреждение. :) В противном случае, я думаю, у вас есть решение (то есть удалить ненужный каталог за раз с помощью filter-branch
).