Как переместить репо в родительскую папку с добавлением родительских файлов в репо и сохранить историю - PullRequest
0 голосов
/ 12 января 2020

У меня есть репо с несколькими филиалами в foo/src, однако я хочу переместить репо вверх (. git становится соседом для sr c) при сохранении истории и добавить все эти файлы во всю историю .

--- foo/  
      |-bar/  
      |-src/
           |-.git
      |-hello.txt

Как я могу это сделать?

Примечание: я пробовал этот ответ , но не смог добавить файлы во всю историю репо. Затем я попытался rebase -i --root ( здесь ), но это применимо только к одной ветви, испортило и устарело остальные.

1 Ответ

1 голос
/ 12 января 2020

ДО НАЧАЛА: Сделайте резервную копию вашего git репо, потому что команда filter-branch разрушительна!


Вы можете использовать git filter-branch с --tree-filter вариант. Руководство для параметров --tree-filter гласит:

Это фильтр для перезаписи дерева и его содержимого. Аргумент оценивается в оболочке с рабочим каталогом, установленным в root извлеченного дерева. Затем новое дерево используется как есть (новые файлы добавляются автоматически, исчезнувшие файлы автоматически удаляются - ни файлы .gitignore, ни любые другие правила игнорирования не имеют никакого эффекта!).

Так что для при каждом коммите мы хотим создать новый каталог src и переместить в него все файлы в дереве (за исключением самого src/, конечно).

git filter-branch --tree-filter '
mkdir -p src
for i in *; do
    if [ "$i" != "src" ]; then
        mv "$i" src/
    fi
done
' --all

После этого вы можете добавить неотслеживаемый bar/ каталог и hello.txt как новый коммит сверху.

Если вы хотите, чтобы bar/ и hello.txt присутствовали в репо с начала истории, вам придется настроить команду фильтра дерева немного.

git filter-branch --tree-filter '
mkdir -p src
for i in *; do
    if [ "$i" != "src" ]; then
        mv "$i" src/
    fi
done
cp -R "/path/to/bar" .
cp "/path/to/hello.txt" .
' --all
...