Отсоедините много подкаталогов в новый, отдельный репозиторий Мерзавца

Этот вопрос основан на подкаталоге Отсоединения в отдельный репозиторий Мерзавца

Вместо того, чтобы отсоединить единственный подкаталог, я хочу отсоединить пару. Например, мое дерево текущего каталога похоже на это:

/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

124
задан Community 23 May 2017 в 12:10
поделиться

2 ответа

Отвечая на свой вопрос здесь ... после множества проб и ошибок.

Мне удалось это сделать, используя комбинацию 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 . Если есть способ удалить дубликаты, то это было бы идеально.

20
ответ дан 24 November 2019 в 01:07
поделиться

Ага. Принудительно перезаписать резервную копию с помощью флага -f при последующих вызовах filter-branch , чтобы отменить это предупреждение. :) В противном случае, я думаю, у вас есть решение (то есть удалить ненужный каталог за раз с помощью filter-branch ).

3
ответ дан 24 November 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: