git-filter-branch: оставить структуру каталогов без изменений - PullRequest
5 голосов
/ 01 марта 2012

У меня есть структура каталогов в моем хранилище:

|-repository/
|  |  |-repository/fileOne
|  |
|  |-subOne/
|  |  |-subOne/fileTwo
|  |
|  |-subTwo/
|     |-subTwo/fileThree

Я хочу переместить каталог subOne в другой репозиторий. Для этого я разделяю subOne, используя git-filter-branch примерно так:

$ git filter-branch --subdirectory-filter subOne --prune-empty

Это оставляет меня с веткой истории, которая выглядит так:

$ git log --oneline
0c0ea11 subOne history
6318bba subOne history
c96fddb Initial commit

Это именно то, чего я хочу; из другого репозитория я могу сделать git fetch и git merge, который добавляет subOne и историю в другой репозиторий. Это здорово.

Однако git-filter-branch удалил subOne. Проверка структуры каталогов в моей ветке:

$ ls
fileOne
$ pwd
/this/is/a/path/repository

pwd должен читать: /this/is/a/path/repository, но ls должен показывать subOne внутри хранилища. Вместо этого я получил файлы из subOne, перемещенные вверх, и каталог был удален.

Как мне извлечь subOne без потери каталога?

1 Ответ

5 голосов
/ 02 марта 2012

pwd должен читать: / this / is / a / path / repository, но ls должен показывать subOne внутри репозитория. Вместо этого я получил файлы из subOne, перемещенные вверх, и каталог был удален.

Оказывается, это операция по умолчанию из git-filter-branch --subdirectory-filter. Цитата из man git-filter-branch:

Результат будет содержать этот каталог (и только этот) в качестве корня проекта.

Чтобы исправить это , я хочу переместить все в / в /subdirectory. К счастью, в man git-filter-branch, под EXAMPLES:

есть фрагмент кода, похожего на вуду.
To move the whole tree into a subdirectory, or remove it from there:
       git filter-branch --index-filter \
               'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
                       GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                               git update-index --index-info &&
                mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

РЕДАКТИРОВАТЬ: ЭТО НЕ РАБОТАЕТ НА MAC OS X . Смотрите мой вопрос здесь для получения дополнительной информации. BSD sed не то же самое, что GNU sed, что раздражает. Чтобы запустить этот пример на OS X, измените sed на gsed; фильтр тогда работает довольно хорошо.

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