ошибка объединения репозиториев git в подкаталоги - PullRequest
6 голосов
/ 17 октября 2011

Я посмотрел несколько потоков, посвященных этому.

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

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

Я также посмотрел справочную страницу ветки git filter.


обновление

Я перешел на систему с двумя сценариями:

#!/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"

до

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

Первый 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.

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

Ответы [ 2 ]

13 голосов
/ 18 октября 2011

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

1) git filter-branch --index filter не использовал '...' должным образом.

Яне уверен, почему это, ошибка с git-filter, проблема с окружением?кто знает.Но я смог это исправить, переместив все из «...» и поместив его в файл сценария.Затем я вызвал скрипт внутри ''

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 не былоto mv

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

1 голос
/ 17 октября 2011

выглядит так, как будто вы пропали без вести в некоторых многострочных перерывах.

...