Перемещение репозитория Git на один уровень иерархии
Git для начинающих вопрос:
У меня есть небольшой частный веб-проект, который версируется локально с msysgit. Нет никакого внешнего хранилища, так как это только для меня, поэтому я могу делать все, что захочу.
У меня это было настроено в каталоге проекта, т. е. в "webroot".
теперь нужно было создать второй каталог, расположенный параллельно webroot. Назовем это активами.
Итак, структура теперь выглядит следующим образом:
project directory
----webroot
----assets
Я бы с удовольствием включите этот новый каталог в репозиторий git, чтобы я также изменил версию файлов, хранящихся там, но, конечно, я не могу использовать "git add ../активы." Я также не склонен создавать новый проект git в project_directory, так как это потеряет все мои предыдущие коммиты.
Итак, как я могу переместить репозиторий из "webroot" в "project_directory", сохраняя мои коммиты, а затем имея возможность включать "активы"?
5 ответов:
Итак, вы хотите, чтобы ваше РЕПО 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:git add assets git commit -m "added assets to the repo"
Я полагаю, вы хотели переписать историю, чтобы содержать все файлы во всех изменениях как будто они всегда были в подкаталоге webroot / а не в корне
git filter-branch manpage имеет ответ, здесь улучшенная версия, которая переписывает все существующие ссылки (ветви) и теги:
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/*) и переупакуйте репо, чтобы освободить устаревшие объекты дерева.
вы также можете просто переместить .git dir до одного уровня и обновите свое рабочее дерево.
cd projectdir mv ./webroot/.git ./.git git config core.worktree /absolute-path-to-project-dir git add assets git commit -m 'adding assets folder'не только положительные, но я уверен, что путь к ядру.рабочее дерево должно быть абсолютным.
ваши коммиты не привязаны локально к папке "webroot", они хранятся в репозитории git.
вы можете просто удалить каталог webroot перепроверить репозиторий в новом местоположении "/каталог проекта" добавить каталог активов и зафиксировать.
rm -Rf webroot git clone path-to-repo git add assets git commit -m "Added assets directory" git push
следующая команда перепишет вашу историю Git. Это будет выглядеть так, как если бы содержание было в
webrootвсе вместе. Обычно переписывание истории затруднительно, если несколько человек работают с РЕПО. Поскольку вы работаете в одиночку, это должно быть хорошо.git filter-branch --index-filter ' git read-tree --prefix="webroot/" $GIT_COMMIT && \ git ls-files \ | sed "s/\/.*//" \ | sort \ | uniq \ | grep -v "^webroot" \ | xargs -L1 git rm -r --cached > /dev/null'
Comments