Мой репозиторий Git находится в неправильном корневом каталоге. Могу я его переместить? (../ вместо того ./)

118

Каким-то образом, когда я git initредактировал свой последний проект около месяца назад, я запускал команду в каталоге на один каталог выше, чем корень моего проекта.

Итак, мой репозиторий находится в ./projectкаталоге, а не в ./project/my-new-projectкаталоге. Я не знаю, как я не осознавал проблему раньше, но до сих пор я никогда не искал каталог .git.

Есть ли способ, не убивая мой проект, переместить репозиторий в соответствующий каталог, а затем сообщить git, что такое новая база проекта? Просто переместить каталог не получится. Git считает, что все файлы удалены.

Майк
источник

Ответы:

19

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

Если вы использовали git для решения проблемы, любое решение обязательно оставит после себя множество записей истории «переместил этот файл сюда», которые на самом деле не меняются, но вы исправляете ошибку во время создания. Лучше просто создать правильно.

ТЕД
источник
2
Я понимаю, что вы говорите, но любые действия в git, которые вы делаете для исправления этого, в конечном итоге приведут к тому, что останется кучка историй «переместил этот файл сюда», которые на самом деле не меняются, но вы исправляете ошибку во время создания. Лучше просто создать правильно.
TED
8
Это ломает многое. stackoverflow.com/a/3247756/825364 - гораздо лучший способ сделать это.
Стив Таубер,
2
Что ж, сохранение истории - вот для чего используется Git. Может быть, нам просто удалить подкаталог .git и удалить Git из нашей системы? В конце концов, использование ftp-сервера вместо vcs - это, наверное, самое простое!
Gherman
2
ответ ниже - гораздо лучший подход, поскольку он сохраняет всю историю
BigMikeW
2
Что касается меня, я сделал это и сразу понял свою ошибку. без каких-либо изменений, о которых нужно беспокоиться, это самый простой способ вернуться к чистому списку.
Майк
261

У меня была противоположная проблема - мне пришлось переместить корень git в родительский каталог (из проекта / src в проект). К моему крайнему удивлению, следующее сработало !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git ловко обнаружил, что все новые файлы были переименованы в версии старых, и история не была потеряна

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

Абхишек Ананд
источник
8
Это отлично сработало для меня. Я также переместил другие файлы конфигурации .git * из каталога, например .gitigore
Relequestual
7
Мой дорогой сэр, вы спаситель жизни. Эта штука действительно РАБОТАЕТ. Спасибо.
Radu Murzea
1
Кроме того, я git rm'dзагружаю файлы из их старого местоположения, поэтому git status(правильно) в конечном итоге сообщил о нескольких операциях переименования. Чем больше я работаю с git, тем больше мне он нравится.
ssc
7
@Mike это должно быть отмечено как принятый ответ. Это предпочтительное решение для повторной инициализации, потому что вы не теряете историю. Если вы мне не верите, количество голосов говорит само за себя.
Джозеф Спенс
3
Спасибо! У меня это сработало, но мне пришлось сделать еще пару вещей: 1. Перед фиксацией я обновился .gitignoreи запустил git add -Aв корневой папке; после этого git правильно отображал все файлы как renamedвместо deleted. 2. Поскольку я использую подмодули, мне пришлось перейти .gitmodulesк новому корню и обновить путь к подмодулю в различных файлах конфигурации git. Чтобы найти, какие файлы нужно изменить, я запустилgrep -nrI --color 'old/path/to/submodule' .
Гвидо Вальтер Петтинари
43

Это сработало для меня и сохранило всю мою историю нетронутой. Из неправильной корневой папки (родительской, где вы случайно инициализировали репо):

Переместите папку:

mv .git thecorrectfolder/

Повторно инициализируем репозиторий git:

cd thecorrectfolder/
git init

Повторно добавьте все файлы, зафиксируйте и нажмите:

git add .
git commit -am 'fixing things'
git push origin master

Готово! Купи себе пива.

Когда вы фиксируете репозиторий git после повторной инициализации, вы получите кучу результатов, которые выглядят следующим образом:

rename {ethanode/coffee => coffee}/app.coffee (100%)

Другими словами, все ваши ссылки из родительской папки переименовываются в правильную папку.

holmesal
источник
Спасибо! Этот метод был именно тем, что мне было нужно!
Гиль Беркерс
У меня это сработало, но было немного некрасиво. Что касается git, я ничего не «перемещал», я просто удалил сотни файлов, а затем добавил сотни других идентичных файлов.
bjmc
6
git init не требуется, а оставшаяся часть совпадает с моим ответом, который был отправлен за много лет до вашего: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchпозволяет переписать историю таким образом. На git filter-branchстранице руководства даже есть ваш случай в качестве примера :

Чтобы переписать репозиторий, чтобы он выглядел так, как будто foodir / был его корнем проекта, и отбросить всю остальную историю:

git filter-branch --subdirectory-filter foodir -- --all

Вероятно, вы захотите git cloneпоместить репо в новый подкаталог до (или после?) git filter-branchЗапуска. (Клонирование до filter-branch и запуск filter-branch на новом клоне будет иметь то преимущество, что оставит исходный .git/каталог на месте в качестве резервного на случай, если что-то пойдет не так.)

ndim
источник
1
Это не «отбрасывает всю остальную историю » (предполагается, что .gitрепо остается на верхнем уровне, а подкаталоги становятся «воспринимаемыми как корень») - это буквально отбрасывает все другие файлы в репо и перемещает все subdirectory/*файлы в корневую папку. ,
Луи Мэддокс
Отличный ответ, но имейте в виду, что если есть файл .gitignore (если он отслеживается), он будет потерян при этой операции. Кроме того, после этого вам нужно будет выполнить git push --forceобновление вышестоящего репозитория.
waldyrious
12

Git может запоминать файлы с их хэшами,

Просто переместите ваш .gitв корневой каталог и скажите gitзапомнить все изменения файлов с помощью --alloption.

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."
М. Реза Насирлоо
источник
3

Используйте git-mvдля перемещения файлов «вверх» в нужное место, затем git-rmв каталог «my-new-project».

jkndrkn
источник
Все наоборот. Я не хочу перемещать все мои файлы в каталог, в котором находится git (там куча других вещей ... это будет раздражать), а затем перемещать git вверх. Я хочу переместить репозиторий в корневой каталог моего проекта.
Майк,
2

Я пришел сюда в поисках способа переместить свой репозиторий куда угодно .

В случае, если я был не один, вот что я в итоге сделал:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Я "git clone --mirror" даю пустую копию моего репо, а затем сказал, чтобы он больше не был голым, поэтому файлы появились в этой новой папке. (Затем проверил, появились ли файлы и журнал.) На всякий случай оставил старое репо ...

Таким образом, я смог переместить свое репо без потери истории.

С наилучшими пожеланиями, Дина

user1565849
источник
Поправьте меня, если я ошибаюсь, но похоже, что вы могли бы добиться этого, просто переместив каталог репозитория в назначенное место, используя только простые инструменты файловой системы, например mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee
2

Пройдя через эту же проблему, мое окончательное решение было:

  1. Переместите папку .git туда, где она должна быть.
  2. Измените каталог в папку, в которую я только что переместил .git
  3. Сбросьте содержимое папки на то, что, по мнению git, должно быть: git reset --hard HEAD
  4. Убедитесь, что содержимое соответствует тому, что должно быть, с помощью kdiff3 или другого инструмента сравнения
  5. Удалите файлы без версий в старом месте.

Это сработало как по волшебству, не повлияв на историю. - NB. Если вы внесли какие-то изменения, обязательно зафиксируйте их перед перемещением каталога .git.

Стив Барнс
источник
-3

Здесь есть два пути:

  1. cd TheWrongDirectory rm -rf .git

  2. просто УДАЛИТЕ папку .git и перейдите в нужный каталог.

В. Ранс
источник