git filter-branch --subdirectory-filter завершается с ошибкой с неверным номером файла - не удалось получить коммиты

Я пытаюсь переместить подкаталог в моем репозитории git, чтобы он стал новым репозиторием (с сохранением существующей истории).

Следуя различным онлайн-предложениям для этого, я клонировал существующее репо, удалил пульт и теперь хочу использовать команду git filter-branch, чтобы удалить все из нового репо, кроме нужного мне каталога. Но когда я запускаю команду, я получаю ошибку.

$ git filter-branch --subdirectory-filter myDirectory -- --all
C:\Program Files (x86)\Git/libexec/git-core\git-filter-branch: line 269: /libexe
c/git-core/git: Bad file number
Could not get the commits

Я использую git-bash в Windows.

Глядя на исходный код git-filter-branch, кажется, что проблема заключается в попытке запустить эту команду:

git rev-list --reverse --topo-order --default HEAD \
    --parents --simplify-merges $rev_args "$@" > ../revs ||
    die "Could not get the commits"

Я могу запустить эту команду без проблем - в зависимости от того, что я заменяю для значения $ rev_args. Когда я передаю одиночные коммиты, все в порядке. Но в сценарии это происходит отсюда:

rev_args=$(git rev-parse --revs-only "$@")

Если я выполню эту команду, я верну строку с множеством тысяч идентификаторов фиксации.

Поэтому я подозреваю, что проблема просто в том, что команда, которую пытается запустить сценарий, слишком длинна для обработки оболочкой, что привело к появлению загадочного сообщения об ошибке, которое я увидел.

Правильный ли этот анализ? Если да, то что мне делать?

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


person sam    schedule 27.10.2014    source источник


Ответы (1)


Я нашел git-filter-branch на своем ПК (для меня это было в / libexec / git-core / git-filter-branch, используя git-bash в Windows)

Закомментировать строки 287-9 (git rev-list .... || die "Could not get commits")

Замените на это:

rm ../revs
for rev in $rev_args
do
  git rev-list --reverse --topo-order --default HEAD \
    --parents --simplify-merges $rev "$@" >> ../revs
done

Затем я мог снова запустить команду git filter-branch --subdirectory-filter myDirectory -- --all, и все было хорошо.

Итак, это кажется довольно ужасным взломом.

  • Есть ли способ лучше?
  • Если нет, можете ли вы предложить какие-либо улучшения этого метода?

Спасибо!

person sam    schedule 27.10.2014