Разница между git filter-subdirectory-filter & git subtree split -P - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь понять разницу между git разбиением поддерева и git веткой фильтра для конкретного варианта использования. Этот вопрос похож на Разница между git ветвью фильтра и git поддеревом? , но не полностью совпадает.

При наличии репозитория с / sub / folder выполните следующие команды:

git checkout master
git checkout -b subtree-branch-1
git filter-branch --subdirectory-filter sub/folder

В итоге вы получите ветку, в которой есть только коммиты, которые применяются к папке / sub /. Теперь давайте начнем снова:

git checkout master
git subtree split -P sub/folder -b subtree-branch-2
git checkout subtree-branch-2

Мне кажется, что я получаю то же самое. График ревизий черепахи Git выглядит одинаково (https://lnk2.tk/iqtvg), журналы для этих двух ветвей выглядят одинаково, а рабочий каталог выглядит одинаково. Я нашел несколько вопросов / постов, которые пытаются объяснить разницу между ветвью фильтра и разделением поддерева, но, исходя из вышесказанного, я просто не вижу этого. И если они действительно дают идентичные результаты, какой смысл было вводить разделение на поддеревья -P? Это просто псевдоним для filter-branch --subdirectory-filter?

1 Ответ

1 голос
/ 11 апреля 2020

Короткая часть такая же, как вы ее указали в сводке комментариев :

... в моем случае использования выше нет никакой разницы.

Тем не менее, общий совет будет использовать git subtree: он более прямой, менее подвержен ошибкам и должен продолжать работать, даже если и когда git filter-branch перестанет работать когда-нибудь.

Подробнее

По сути, вы независимо друг от друга заново открыли, как появилась команда git subtree: различные пользователи хотели взять свой существующий репозиторий, извлечь некоторую его часть - обычно библиотеку - и экспортировать это как новый Git репозиторий. Команда git filter-branch могла сделать это, вот что они сделали.

Это было достаточно популярно и достаточно полезно, так что git filter-branch создал фильтр с именем --subdirectory-filter, предназначенный для этой работы. См. commit 685ef546b62d063c72b401cd38b83a879301aac4 Johannes Schindelin в 2007 году, впервые выпущенный в Git версии 1.5.3.

Само расщепление поддерева было недостаточно (и git filter-branch - это своего рода из опасно-мощного инструмента), поэтому в апреле 2009 года Эвери Пеннарун ввел команду git subtree, начиная с commit 0ca71b3737cbb26fbf037aa15b3f58735785e6e3, в качестве экспериментального сценария для кандидата на выпуск 1.7.11. Это реализовало разделение и, почти сразу, --rejoin и add. Первая фактически установленная версия, а не надстройка, распространяемая с Git, взята из commit 0d31de303f9e8e28cc1649dbf41c1cc635bae2d8 от Ben Walton. Все это было выпущено в Git 1.7.11.

В последнее время само по себе git filter-branch формально устарело: его трудно использовать правильно, медленно, и, как правило, не очень приятно. Новая команда git filter-repo более быстрая и более полезная, хотя она требует, чтобы вы знали достаточно Python, чтобы использовать ее, и она все еще не распространяется вместе с Git. Но git subtree, у которого есть конкретная c цель, а не общая цель, останется без изменений и будет иметь такое же применение в будущем, даже если git filter-repo фактически полностью заменит git filter-branch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...