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


118

Якось, коли я git initредагував свій останній проект місяць або близько того тому, я запустив команду в каталозі на один каталог вище, ніж корінь мого проекту.

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

Чи є спосіб, не вбиваючи мій проект, перемістити сховище у відповідний каталог, а потім сказати git, що таке нова база проекту? Просто переміщення каталогу не працює. Git вважає, що всі файли видалено.

Відповіді:


19

Мабуть, найпростіша річ, якщо ви вже не створили історію, яку хочете зберегти, - це просто видалити .gitпідкаталог і повторно встановити init у правильному каталозі.

Якщо ви використовували git для вирішення проблеми, будь-яке рішення обов'язково залишило б після себе багато записів історії "переміщених сюди цього файлу", які насправді не змінюються, але ви виправляєте виправлення під час створення. Краще просто створити його правильно.


2
Я бачу, що ви говорите, але будь-які дії в git, які ви робите, щоб виправити це, в кінцевому підсумку залишать купу історій "переміщених тут файлів", які насправді не змінюються, але ви виправляєте виправлення під час створення. Краще просто створити його правильно.
ТЕД

8
Це ламає багато чого. stackoverflow.com/a/3247756/825364 - це набагато кращий спосіб зробити це.
Стів Таубер

2
Що ж, Git - це збереження історії - для чого використовується Git. Можливо, нам просто слід видалити .git підкаталог і видалити Git з нашої системи? Використання ftp-сервера замість vcs - це, мабуть, найпростіша річ!
Герман

2
відповідь нижче - набагато кращий підхід, оскільки він зберігає всю історію
BigMikeW

2
Тож для мене я це зробив і одразу зрозумів свою помилку. не турбуючись про будь-які зміни, це найпростіший спосіб повернутися до чистого сланця.
Майк

261

У мене була протилежна проблема - довелося перенести git root у батьківський каталог (з проекту / 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 repo:

cd thecorrectfolder/
git init

Повторно додайте всі файли, введіть і натисніть:

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

Готово! Прийміть собі пиво.

Після здійснення повторної ініціалізації git repo ви отримаєте купу результатів, який виглядає приблизно так:

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

Іншими словами, всі ваші посилання з батьківської папки і перейменовані на використання правильної папки.


Дякую! Цей метод був саме тим, що мені було потрібно!
Giel Berkers

Це працювало для мене, але це було трохи некрасиво. Що стосується 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Запуску. (Клонування перед фільтром філії та запуск гілки фільтра на новому клоні матиме перевагу залишити оригінальний .git/редактор на місці в якості резервної копії у випадку, якщо щось піде не так.)


1
Це не "викидає всю іншу історію " (припускаючи, що .gitрепо залишається на найвищому рівні, тоді як підкаталоги стають "корінням") - це буквально відкине всі інші файли репо, і перемістить усі subdirectory/*файли до кореневої папки .
Луї Маддокс

Чудова відповідь, але майте на увазі, що якщо є файл .gitignore (якщо його відслідковується), він буде втрачений під час цієї операції. Крім того, вам потрібно буде зробити, git push --forceщоб оновити сховище вище за потоком після цього.
waldyrious

12

Git може запам'ятати файли з їх хешами,

Просто перенесіть .gitу кореневий каталог і скажіть, gitщоб запам'ятати всі зміни файлів за допомогою --allпараметра.

$ 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до каталогу "мій новий проект".


Це навпаки. Я не хочу переміщувати всі мої файли вниз до каталогу, де знаходиться 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", так що я гола копія мого репо, а згодом сказала, що вона більше не буде голою, тому файли з'явилися у цій новій папці. (Потім перевірте, чи не з’явилися файли та журнал.) Затримайте старий репо на деякий час, про всяк випадок ...

Таким чином я зміг перемістити своє репо, не втрачаючи історії.

Найкращі привітання, Діна


Виправте мене, якщо я помиляюся, але, схоже, ви могли цього досягти, просто перемістивши каталог репозиторіїв у визначене місце, використовуючи, окрім, як голі інструменти файлової системи, як-от 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. Видаліть неперевершені файли зі старого місця.

Це працювало як магія, не впливаючи на історію. - Примітка. Якщо ви внесли деякі зміни, обов'язково введіть їх перед переміщенням у каталог .git.


-3

Тут є два способи:

  1. cd TheWrongDirectory rm -rf .git

  2. просто ВИДАЛУЙТЕ папку .git і перейдіть до потрібного каталогу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.