Перемещение репозитория git на один уровень иерархии
Git начальный вопрос:
У меня есть небольшой частный веб-проект, который локализован локально с помощью msysgit. Нет внешнего репозитория, поскольку это только для меня, поэтому я могу делать все, что захочу.
У меня была эта настройка в каталоге проекта, то есть в "webroot".
Теперь нужно создать второй каталог, расположенный параллельно webroot. Позвольте назвать его активами.
Итак, структура выглядит следующим образом:
\ project directory
----\webroot
----\assets
Я хотел бы включить этот новый каталог в репозиторий git, так что я также изменил бы версию на хранящиеся там файлы, но, конечно, я не могу использовать "git add../assets", Я также не склонен создавать новый проект git в project_directory, так как это потеряло бы все мои предыдущие коммиты.
Итак, как мне переместить репозиторий из "webroot" в "project_directory", сохраняя мои коммиты, а затем включив "активы"?
Ответы
Ответ 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