Как извлечь подмножество истории из Git? - PullRequest
10 голосов
/ 08 сентября 2010

Обновление: Я попытался упростить реальный пример здесь, чтобы получить четкое объяснение моих вариантов, но это не сработало.Приведенные ниже примеры, приведенные ниже, являются слишком общими, чтобы заставить работать даже этот простой пример.

Я был способен делать подобные вещи с SVN все время и достаточно хорошо в этом разбирался.Теперь я нахожу это чрезвычайно трудным в Git и начинаю верить, что моя история слишком сложна, чтобы ее можно было разделить на части.

Проблема реального мира: У меня около дюжиныфайлы, которые были перемещены и переименованы.Их история перемешана с историей сотен других файлов, для которых я хочу полностью удалить историю.

В SVN я мог бы использовать последовательность dump / include-filter / exclude-filter /загрузить, чтобы обрезать репозиторий, и редко мне может понадобиться переименовать пути вручную в самом файле дампа перед загрузкой.

Примерно так, и я бы сделал:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa

svnadmin dump FooSrc > Full.dump 2> Dump.log
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Full.dump > Filter_1.dump 2> Filter_1.log
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Filter_1.dump > Filter_2.dump 2> Filter_2.log
svnadmin create FooDest
svnadmin load FooDest --ignore-uuid < Filter_2.dump > Load.log 2> Load_Errors.log

ДелаетУ кого-нибудь есть хороший пример этого, который представляет собой нечто большее, чем простое удаление одного файла или экспорт одного подкаталога?

Самый простой способ определить набор файлов - это список из 7 путей к каталогам.,Все, что находится внутри этих каталогов, необходимо сохранить, а все, что находится снаружи, необходимо удалить из истории.


Упрощенная проблема:

У меня есть Git-репозиторийв котором есть несколько файлов, которые я хотел бы извлечь в свой собственный репозиторий.Проблема в том, что эти файлы создавались и изменялись на протяжении всей истории исходного репозитория, поэтому у меня возникают проблемы с выяснением того, как их чисто извлекать.

Вот суть того, как выглядит моя история (только ссовершает и многое другое, чтобы игнорировать).Как вы можете видеть, я, очевидно, не планировал, чтобы эти файлы были позже вычеркнуты из истории:

commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56

M    src/Foo/Bar/FileToExtract2.foo
A    src/Foo/Bar/FileToExtract3.bar
D    src/Foo/AnotherFileToIgnore.txt

commit 05d26f23518083270cc45bf037ced29bec45e064

M    src/Foo/Blah/IgnoreThisOneToo.foo
M    src/Foo/AnotherFileToIgnore.txt

commit 343187228f4bd8e4427395453034c34ebd9a95f3

M    src/Foo/Bar/FileToExtract1.txt
M    src/Foo/AnotherFileToIgnore.txt

commit 46a0129104ac31291462f657292aab43f8883d8d

A    src/Foo/Bar/FileToExtract1.txt
A    src/Foo/Bar/FileToExtract2.foo
M    src/Foo/FileToIgnore.txt

commit 3fe6af56f0d8dc42fcb5b0bafee41bff534ba2cc

A    src/ReadMe.txt
A    src/IgnoreMe.foo
A    src/Foo/FileToIgnore.txt
A    src/Foo/Blah/IgnoreThisOneToo.foo
A    src/Foo/AnotherFileToIgnore.txt

В конце концов, я хочу иметь чистый репозиторий с полная история только файлов в src/Foo/Bar/.Остальное можно игнорировать.Я также в порядке с сохранением этого хранилища как есть (то есть без перезаписи истории) и просто фиксацией удаления для всего этого каталога.

В SVN я бы использовал svnadmin dump, svndumpfilter и svnadmin load.Если бы я был осторожен, я мог бы даже вручную отредактировать файл дампа, чтобы очистить пути и т. Д.

Я просматривал команды Git и не могу найти способ сделать это.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 08 сентября 2010

Вы можете использовать git filter-branch и отсоединить каталог Foo от своего собственного каталога.
См .:

3 голосов
/ 10 сентября 2010

Эквивалент svnadmin dump, svndumpfilter и svnadmin load SVN будет git fast-export, один собственный сценарий (см. примеры ) иgit fast-import.

...