Перемещение git-репозитория на один уровень иерархии - PullRequest
65 голосов
/ 23 марта 2011

Git начинающий вопрос:

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

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

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

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

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

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

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

Ответы [ 5 ]

64 голосов
/ 23 марта 2011

Итак, вы хотите, чтобы ваш репозиторий 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"
12 голосов
/ 28 октября 2011

Вы также можете просто переместить свой .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'

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

9 голосов
/ 27 марта 2011

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

Фильтр git-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 / *) и упаковать репо, чтобы потерять устаревшие объекты дерева.

5 голосов
/ 23 марта 2011

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

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

rm -Rf webroot
git clone path-to-repo
git add assets 
git commit -m "Added assets directory"
git push
0 голосов
/ 10 февраля 2018

Следующая команда переписывает вашу историю 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'
...