Подтвердить что ты не робот

Перемещение репозитория git на один уровень иерархии

Git начальный вопрос:

У меня есть небольшой частный веб-проект, который локализован локально с помощью msysgit. Нет внешнего репозитория, поскольку это только для меня, поэтому я могу делать все, что захочу.

У меня была эта настройка в каталоге проекта, то есть в "webroot".

Теперь нужно создать второй каталог, расположенный параллельно webroot. Позвольте назвать его активами.

Итак, структура выглядит следующим образом:

\ project directory
----\webroot
----\assets

Я хотел бы включить этот новый каталог в репозиторий git, так что я также изменил бы версию на хранящиеся там файлы, но, конечно, я не могу использовать "git add../assets", Я также не склонен создавать новый проект git в project_directory, так как это потеряло бы все мои предыдущие коммиты.

Итак, как мне переместить репозиторий из "webroot" в "project_directory", сохраняя мои коммиты, а затем включив "активы"?

4b9b3361

Ответ 1

Итак, вы хотите, чтобы ваш репозиторий git выглядел следующим образом:

<projectdir>
    /.git
    /webroot
    /assets

Чтобы сделать это, вы должны переместить существующие файлы в своем репо в новый подкаталог webroot.

cd <git repo root>
mkdir webroot
git mv <all your files> webroot
git commit --all -m "moved all existing files to new 'webroot' directory"

Затем на вашей локальной файловой системе вы хотите переместить свой клон на один каталог выше, где он сейчас:

cd <projectdir>
mv webroot/* .
rmdir webroot

Затем вы хотите добавить каталог assets (и файлы) в git repo:

git add assets
git commit -m "added assets to the repo"

Ответ 2

Я предполагаю, что вы хотели переписать историю, чтобы содержать все файлы во всех ревизиях, как если бы они всегда находились в подкаталоге webroot/вместо корневого

В man-странице git с фильтром-ответчиком есть ответ, здесь улучшенная версия, которая перезаписывает все существующие refs (ветки) и теги:

time git filter-branch --index-filter 'git ls-files -s |
         sed "s-\t\"*-&webroot/-" |
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --tag-name-filter cat -- --all

Была предпринята попытка сделать операцию индексирования только для того, чтобы процесс работал быстро даже для больших репозиториев. Не забывайте (когда удовлетворены) избавиться от исходных ссылок (.git/refs/original/*) и переупаковать репо, чтобы потерять устаревшие древовидные объекты.

Ответ 3

Вы также можете просто перенести свой флаг .git на один уровень и обновить рабочую строку.

cd projectdir
mv ./webroot/.git ./.git
git config core.worktree /absolute-path-to-project-dir
git add assets
git commit -m 'adding assets folder'

Не положительно, но я уверен, что путь к core.worktree должен быть абсолютным.

Ответ 4

Ваши коммиты не привязаны локально к папке "webroot", которую они хранят в репозитории git.

Вы можете просто удалить каталог webroot, перепроверить репозиторий в новом каталоге "/project", добавить каталог ресурсов и зафиксировать.

rm -Rf webroot
git clone path-to-repo
git add assets 
git commit -m "Added assets directory"
git push