фильтр-ветка для удаления лишнего каталога - PullRequest
10 голосов
/ 15 апреля 2011

Я перевожу несколько репозиториев Subversion в Git, но они были настроены немного странно: стандартная структура транка / веток / тегов находится в нескольких подкаталогах репозитория. Теги / branch и / пустые, поэтому импорт git-svn закончился только с магистральными каталогами.

svn/
  proj1/
    trunk/
      src/
  proj2/
    trunk/
      src/

Я хотел бы использовать git filter-branch, чтобы удалить лишние папки ствола, но оставить остальные нетронутыми:

svn/
  proj1/
    src/
  proj2/
    src/

Основываясь на последнем примере в документации , это то, что я имею до сих пор:

git filter-branch --index-filter \
    'git ls-files -s | sed "s-/trunk/-/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

Мне кажется, что sed делает свою работу, как этот вход:

100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0       proj1/trunk/src/file1.txt

Производит этот вывод:

100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0       proj1/src/file1.txt

Однако, когда я запускаю всю команду, я получаю следующую ошибку:

Rewrite e00c119cfb755f741dc0e17c36d36bc2ddd27562 (1/42)mv: cannot stat `/c/dev/R
epo/.git-rewrite/t/../index.new': No such file or directory
index filter failed: git ls-files -s | sed "s-/trunk/-/-" |
            GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                git update-index --index-info &&
         mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"

Есть идеи? Я использую git версии 1.7.3.1.msysgit.0 в Windows.

Обновление: Теперь при использовании git версии 1.9.0.msysgit.0 аналогичная ситуация приводит к другой ошибке (примечание .git-rewrite не существует до выполнения команды):

rm: cannot remove `c:/Path/to/svn/.git-rewrite/revs': Permission denied
rm: cannot remove directory `c:/Path/to/svn/.git-rewrite': Directory not empty

То же самое исправление в конечном итоге сработало.

Ответы [ 2 ]

9 голосов
/ 15 апреля 2011

разобрался по комментарию здесь .Кажется, проблема в том, как git-svn представляет «пустые» (только для каталога) коммиты.Это нормально работает, если я начинаю с нормального коммита:

git filter-branch --index-filter \
    'git ls-files -s | sed "s-/trunk/-/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' 83df928c..HEAD
1 голос
/ 15 апреля 2011

Хм. Я не вижу ничего плохого в том, что вы используете, и он прекрасно работает в моем репозитории:

$ git init
Initialized empty Git repository in /Users/bcampbel/tmp/git-subdir/.git/
$ mkdir -p proj1/trunk
$ echo "hello" > proj1/trunk/test.txt
$ git add .
$ git commit -m "initial commit"
[master (root-commit) cd431f3] initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 proj1/trunk/test.txt
$ echo "foo" > proj1/trunk/another.txt
$ git add .
$ git commit -m "add a file"
[master 84139f2] add a file
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 proj1/trunk/another.txt
$ git filter-branch --index-filter \
>     'git ls-files -s | sed "s-/trunk/-/-" |
>         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
>             git update-index --index-info &&
>      mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
Rewrite 84139f26c7921721190b3c5dd57e2b49a41034aa (2/2)
Ref 'refs/heads/master' was rewritten
$ ls proj1/
another.txt test.txt

Похоже, по какой-то причине файл index.new не записан в вашей системе или не может быть прочитан командой mv. Я не уверен, почему это так, но мне интересно, может ли это быть из-за того, что вы используете msysgit в Windows. У вас есть Linux или Mac, на котором вы могли бы его примерить?

...