Git Surgery - разделение хранилища и изменение структуры каталогов - PullRequest
1 голос
/ 12 января 2011

У меня есть следующий единственный репозиторий с этой структурой:

my-repo/
  foo/
    contents-of-foo
  bar/
    contents-of-bar
  baz/
    contents-of-baz
  other-contents

Я хочу получить следующую структуру, в идеале, без потери истории / тегов:

new-combined-repo/
  contents-of-foo
  bar/
    contents-of-bar
  baz/
    contents-of-baz

и

my-other-repo
  other-contents

Я немного застрял в том, как поступить.Я пробовал это:

$ pushd path/to/my-repo/
$ git mv bar foo/
$ git mv baz foo/
$ git commit -m "Move bar and baz prior to repository extraction"
$ cd ..
$ git clone --no-hardlinks my-repo new-combined-repo
$ pushd new-combined-repo
$ git remote rm origin
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
      --prune-empty -- --all
$ git log --follow foo/bar/some-file

Это отбросило всю историю для some-file до команды git mv.

Лучшие предложения?ТИА.

Ответы [ 2 ]

1 голос
/ 13 января 2011
git filter-branch --tree-filter 'mv bar baz foo; rm *'

Сохраните копию своего хранилища, прежде чем возиться с этим rm *, пожалуйста.

1 голос
/ 12 января 2011

Почему бы не написать древовидный фильтр (для git filter-branch --tree-filter), который удаляет все каталоги, кроме тех, которые вы хотите сохранить?Как этот (не проверенный):

#!/bin/bash
shopt -s extglob dotglob
rm -r !(bar|baz|.gitignore)

Это, конечно, не сохранит истории файлов, которые были перемещены в bar или baz, но кроме этого необычного случая историябыть в целости и сохранности.

...