Ошибка объединения репозиториев git в подкаталоги

Я рассмотрел несколько потоков, рассматривающих это.

Объединение нескольких репозиториев git

Объединение нескольких репозиториев git, имеющих пробел в их имени

Я также просмотрел man-страницу git.


Обновление

Я изменил систему 2 script:

#!/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-фильтром....


Обновить снова:

Когда я меняю

mv "$ GIT_INDEX_FILE.new" "$ GIT_INDEX_FILE"

to

mv "$ GIT_INDEX_FILE.new" "$ GIT_INDEX_FILE" || правда

Не удалось выполнить первое mv, но все остальные (пока) работают.


Все это завершилось этим script:

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

Теоретически этот script должен принимать все файлы в репозитории, вставлять их в data/perl_modules/и переписывать историю, чтобы она выглядела, что файлы всегда были в этом каталоге.

Однако я получаю эту ошибку:

fatal: ambiguous argument 'ls-files': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

Не знаю, как это сделать, я не понимаю, что script достаточно хорошо для его отладки, и он берется непосредственно из man-страницы git.

Я пробовал это как до, так и после ручного перемещения файлов в subdir в случае необходимости их перемещения или необходимости их перемещения.

Ответы

Ответ 1

Было несколько проблем.

1) git фильтр-ветвь -index-фильтр не использовал "...".

Я не уверен, почему это, ошибка с git -filter, проблема с окружающей средой? кто знает. Но я смог исправить это, переместив все из "..." и вложив его в файл script. Затем я назвал script внутри

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" || true

2) Первое коммит было пустым, поэтому не было index.new до mv

Этот git репо был импортирован из svn с помощью git -svn. Таким образом, первая фиксация была полностью пустой, просто говоря инициализацию начального svn-репо. Как таковых не было перемещено файлов, и нет index.new для перемещения. Это было решено добавлением || true для команды mv. Однако обратите внимание, что если сбой нескольких команд mv у вас есть другие проблемы.

Ответ 2

похоже, что у вас есть \missing в некоторых многострочных разломах.