ДО НАЧАЛА: Сделайте резервную копию вашего 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