Я просмотрел несколько потоков, обращающихся к этому.
Объединение нескольких репозиториев git
Объединение нескольких репозиториев git с пробелом в имени
Я также просмотрел справочную страницу git filter-branch.
update
Я перешел на систему с двумя сценариями:
#!/bin/bash
git filter-branch --index-filter '~/doit.sh' HEAD
и doit.sh
#!/bin/bash
git ls-files -s | \
sed "s-\t-&data/perl_modules/-" | \
GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info && \
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
Это позволяет избежать предыдущей ошибки, но теперь получает следующее (путь заменен на [...]):
Rewrite c35e4ef0626fb2045f57fa5b605e7663b8d06196 (1/10977)mv: cannot stat `[...]/.git-rewrite/t/../index.new': No such file or directory
index filter failed: ~/doit.sh
Когда я запускаю
ls-files- s | sed ... | git update-index ...
, я получаю индексный файл, который он должен сгенерировать. Также, когда я изменяю файл doit.sh для вывода результата sed вместо того, чтобы передавать его в git update-index, он, похоже, производит правильный вывод ... кажется, что git update-index просто не создает файл при запуске под --index-filter ....
Обновить снова:
Когда я меняю
mv "$ GIT_INDEX_FILE.new" "$ GIT_INDEX_FILE"
на
mv "$ GIT_INDEX_FILE.new" " $ GIT_INDEX_FILE "|| true
Первый mv не работает, но все остальные (пока) работают.
Все это завершилось следующим сценарием:
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&data/perl_modules/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
Теоретически этот сценарий должен взять все файлы в репозиторий, поместить их в data / perl_modules / и переписать историю так, чтобы казалось, что файлы всегда находились в этом каталоге.
Однако я получаю эту ошибку:
fatal: ambiguous argument 'ls-files': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Не знаю, как действовать, я недостаточно хорошо понимаю сценарий, чтобы отлаживать его, и он взят непосредственно из справочной страницы git filter-branch.
Я пробовал это как до, так и после ручного перемещения файлов в поддиректорию на случай, если потребуется, чтобы они были перемещены, или требовалось, чтобы они не перемещались.