git filter-branch с --subdirectory-filter удаляет все файлы

Я хотел бы довольно стандартное разделение репозитория. Оригинальный репозиторий имеет следующую структуру:

root
|-AAA
|-BBB
  |-BBB1
  |-BBB2
|-CCC

Я попытался извлечь каталог BBB1 и все его содержимое в отдельный репозиторий с помощью команды

git filter-branch --subdirectory-filter BBB/BBB1 -- --all

что приводит к тому, что git переписывает кучу коммитов и заканчивается финальным оператором git

Ref 'refs/heads/master' was rewritten

Так что это кажется мне совершенно нормальным. Но когда я просматриваю каталог root после завершения работы git, репозиторий больше не содержит никаких исходных файлов, а только папку .git в root. Просматривая этот репозиторий с помощью SourceTree, я вижу в журнале (вероятно) правильные коммиты, которые могли бы повлиять только на BBB1, но каждый коммит больше не ссылается ни на какие файлы, так как они все исчезли!

Что я делаю не так? Почему пропали все файлы, даже те, которые я действительно отфильтровал?

Заранее спасибо!

Саймон


person Franz Xaver    schedule 29.09.2015    source источник


Ответы (2)


Убедитесь, что вы используете разделители пути в стиле Unix (/) даже на компьютерах с Windows.

Это приводит к пустому репо с правильно отфильтрованной историей (\):

git filter-branch --subdirectory-filter BBB\BBB1 -- --all

Это приводит к тому, что ваш подкаталог подтягивается к корню репо и правильно отфильтрованной истории (/):

git filter-branch --subdirectory-filter BBB/BBB1 -- --all

Поскольку вы, как правило, теряете возможность автозаполнения при использовании разделения каталогов / в командной строке Windows, может быть проще создать свой путь, а затем изменить его на разделение в стиле Unix.

Отказ от ответственности

Я знаю, что исходный вопрос показывает разделители /, но если вы передадите разделители \ в аргументе подкаталога, вы увидите точно такой же описанный конечный результат, что вызывает у меня скептицизм. Как только вы переключаетесь на разделители / в стиле Unix на компьютере с Windows, все работает отлично.

person patridge    schedule 05.05.2017

У меня возникла точно такая же проблема, и я не смог решить ее с помощью команды filter-branch и не нашел никаких объяснений этой проблемы. Но есть и другой способ добиться аналогичного результата, который сработал для меня. Он основан на команде поддерева. Я нашел ссылку на этот подход здесь Отсоединить (переместить) подкаталог в отдельный репозиторий Git и пример его использования здесь https://makingsoftware.wordpress.com/2013/02/16/using-git-subtrees-for-repository-separation/. Я следил за этой статьей, и это сработало для меня совершенно нормально.

person Alex T.    schedule 14.06.2016