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



Git для начинающих вопрос:



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



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



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



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



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


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



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

610   5  

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

    Ничего не найдено.