Moje repozytorium Git znajduje się w niewłaściwym katalogu głównym. Czy mogę to przenieść? (../ zamiast ./)

118

W jakiś sposób, kiedy git initokoło miesiąca temu zredagowałem swój najnowszy projekt, uruchomiłem polecenie w katalogu o jeden katalog wyżej niż katalog główny mojego projektu.

Więc moje repozytorium znajduje się w ./projectkatalogu, a nie w ./project/my-new-projectkatalogu. Nie wiem, jak wcześniej nie zdawałem sobie sprawy z tego problemu, ale do tej pory po prostu nigdy nie szukałem katalogu .git.

Czy jest sposób, bez zabijania mojego projektu, aby przenieść repozytorium do odpowiedniego katalogu, a następnie powiedzieć gitowi, jaka jest nowa baza projektu? Samo przeniesienie katalogu nie działa. Git uważa, że ​​wszystkie pliki zostały usunięte.

Mikrofon
źródło

Odpowiedzi:

19

Prawdopodobnie najprostszą rzeczą, o ile nie utworzyłeś już historii, którą chcesz zapisać, byłoby po prostu usunięcie .gitpodkatalogu i ponowne wykonanie init w odpowiednim katalogu.

Jeśli użyłeś git do rozwiązania problemu, każde rozwiązanie koniecznie pozostawiłoby wiele wpisów w historii „przeniesiono ten plik tutaj”, które w rzeczywistości nie są zmianami, ale naprawiasz błąd w czasie tworzenia. Lepiej jest po prostu dobrze to stworzyć.

PRZETRZĄSAĆ
źródło
2
Rozumiem, co mówisz, ale wszelkie działania in-git, które wykonujesz, aby to poprawić, zakończą się pozostawieniem wielu historii „przeniesionych tutaj”, które w rzeczywistości nie ulegają zmianom, ale naprawiasz błąd w czasie tworzenia. Lepiej jest po prostu dobrze to stworzyć.
TED
8
To psuje wiele rzeczy. stackoverflow.com/a/3247756/825364 to znacznie lepszy sposób na zrobienie tego.
Steve Tauber
2
Cóż, zapisywanie historii jest tym, do czego służy Git. Może powinniśmy po prostu usunąć podkatalog .git i odinstalować Gita z naszego systemu? Użycie serwera ftp zamiast vcs jest w końcu prawdopodobnie najprostszą rzeczą!
Gherman,
2
odpowiedź poniżej jest dużo lepszym podejściem, ponieważ zachowuje całą historię
BigMikeW,
2
Więc dla mnie zrobiłem to i natychmiast zdałem sobie sprawę z mojego błędu. bez konieczności martwienia się o zmiany, to najłatwiejszy sposób na powrót do czystego konta.
Mike
261

Miałem odwrotny problem - musiałem przenieść katalog główny git do katalogu nadrzędnego (z projektu / src do projektu). Ku mojemu wielkiemu zdziwieniu, poniższe zadziałały !!

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

git sprytnie wykrył, że wszystkie nowe pliki zostały przemianowane na wersje starych i żadna historia nie została utracona

Możesz spróbować czegoś podobnego ... przenieść folder .git i ponownie dodać pliki przed zatwierdzeniem

Abhishek Anand
źródło
8
To zadziałało idealnie dla mnie. Przeniosłem także inne pliki konfiguracyjne .git * z katalogu, takiego jak .gitigore
Relequestual
7
Mój drogi panie, jesteś wybawcą życia. To naprawdę DZIAŁA. Dziękuję Ci.
Radu Murzea
1
Dodatkowo, git rm'dpliki pochodzą z ich starej lokalizacji, więc git status(poprawnie) zakończyło się raportowaniem wielu operacji zmiany nazwy. Im więcej pracuję z git, tym bardziej mi się to podoba.
ssc
7
@Mike powinno to być oznaczone jako zaakceptowana odpowiedź. Jest to preferowane rozwiązanie do ponownego inicjowania, ponieważ nie tracisz historii. Jeśli mi nie wierzysz, liczba głosów pozytywnych mówi sama za siebie.
Joseph Spens
3
Dziękuję Ci! U mnie to zadziałało, ale musiałem zrobić jeszcze kilka rzeczy: 1. Przed zatwierdzeniem zaktualizowałem .gitignorei uruchomiłem git add -Aw folderze głównym; potem git poprawnie pokazywał wszystkie pliki jako renamedzamiast deleted. 2. Ponieważ używam modułów podrzędnych, musiałem przejść .gitmodulesdo nowego katalogu głównego i zaktualizować ścieżkę modułu podrzędnego w różnych plikach konfiguracyjnych git. Aby znaleźć pliki do zmodyfikowania, uruchomiłemgrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari
43

To zadziałało dla mnie i zachowało całą moją historię nietkniętą. Z nieprawidłowego folderu głównego (nadrzędnego, w którym przypadkowo zainicjowałeś repozytorium):

Przenieś folder:

mv .git thecorrectfolder/

Ponownie zainicjuj repozytorium git:

cd thecorrectfolder/
git init

Ponownie dodaj wszystkie pliki, zatwierdź i wypchnij:

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

Gotowe! Kup sobie piwo.

Kiedy zatwierdzasz repozytorium git po ponownej inicjalizacji, otrzymasz zbiór danych wyjściowych, które wyglądają następująco:

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

Innymi słowy, wszystkie odwołania z folderu nadrzędnego i zmiana nazwy w celu użycia właściwego folderu.

holmesal
źródło
Dzięki! Ta metoda była dokładnie tym, czego potrzebowałem!
Giel Berkers
To działało dla mnie, ale było trochę brzydkie. Jeśli chodzi o git, niczego nie `` przenosiłem '', po prostu usunąłem setki plików, a następnie dodałem setki innych, identycznych plików.
bjmc
6
git init nie jest wymagany, a pozostała część jest taka sama jak moja odpowiedź, która została przesłana lata wcześniej niż twoja: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchpozwala na przepisywanie historii w ten sposób. Strona git filter-branchpodręcznika zawiera nawet Twój przypadek jako przykład :

Aby przepisać repozytorium tak, aby wyglądało, jakby foodir / był jego korzeniem projektu i odrzucić całą historię:

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

Prawdopodobnie chcesz git cloneprzenieść repozytorium do nowego podkatalogu przed (lub po?) git filter-branchUruchomieniu. (Klonowanie przed filter-branch i uruchamianie filter-branch na nowym klonie miałoby tę zaletę, że pozostawiłoby oryginalny .git/katalog na miejscu jako kopię zapasową na wypadek, gdyby coś poszło nie tak.)

ndim
źródło
1
Nie powoduje to „odrzucenia całej pozostałej historii ” (co sugeruje, że .gitrepozytorium pozostaje na najwyższym poziomie, podczas gdy podkatalogi stają się „traktowane jako katalog główny”) - spowoduje to dosłowne odrzucenie wszystkich innych plików w repozytorium i przeniesienie wszystkich subdirectory/*plików do folderu głównego .
Louis Maddox,
Świetna odpowiedź, ale pamiętaj, że jeśli istnieje plik .gitignore (jeśli jest śledzony), zostanie on utracony podczas tej operacji. Będziesz także musiał wykonać a, git push --forceaby zaktualizować późniejsze repozytorium.
waldyrious
12

Git może zapamiętywać pliki wraz z ich hashami,

Po prostu przenieś się .gitdo katalogu głównego i powiedz, gitaby zapamiętać wszystkie zmiany plików za pomocą --allopcji.

$ 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."
M. Reza Nasirloo
źródło
3

Użyj, git-mvaby przenieść pliki „w górę” do właściwej lokalizacji, a następnie do git-rmkatalogu „mój-nowy-projekt”.

jkndrkn
źródło
Jest na odwrót. Nie chcę przenosić wszystkich moich plików do katalogu, w którym znajduje się git (jest tam mnóstwo innych rzeczy ... to byłoby denerwujące), a następnie przenieść git w górę. Chcę przenieść repozytorium do katalogu głównego mojego projektu.
Mike
2

Przyjechałem tutaj, szukając sposobu, aby przenieść moje repozytorium w dowolne miejsce .

W przypadku, gdy nie byłem jedyny, oto co zrobiłem w końcu:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Zrobiłem „git clone --mirror” da gołą kopię mojego repozytorium, a następnie powiedziałem mu, aby nie było już nagie, więc pliki się pojawiły w tym nowym folderze. (Następnie sprawdziłem, czy pojawiły się pliki i dziennik). Zatrzymałem stare repozytorium przez chwilę, na wszelki wypadek ...

W ten sposób mogłem przenieść repozytorium bez utraty historii.

Pozdrowienia, Dinah

user1565849
źródło
Popraw mnie, jeśli się mylę, ale wygląda na to, że można to osiągnąć, po prostu przenosząc katalog repozytorium do wyznaczonej pozycji, używając wyłącznie narzędzi systemu plików, takich jak mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee
2

Po przejściu przez ten sam problem, moim ostatecznym rozwiązaniem było:

  1. Przenieś folder .git tam, gdzie miał być.
  2. Zmień katalog na folder, do którego właśnie przeniosłem .git
  3. Zresetuj zawartość folderu do tego, co według git powinno być: git reset --hard HEAD
  4. Sprawdź, czy zawartość jest zgodna z tym, co powinna, za pomocą kdiff3 lub innego narzędzia do porównywania
  5. Usuń teraz niewersjonowane pliki ze starej lokalizacji.

Działało jak magia, bez wpływu na historię. - UWAGA: Jeśli dokonałeś jakichś zmian, upewnij się, że zostały one zatwierdzone przed przeniesieniem katalogu .git.

Steve Barnes
źródło
-3

Istnieją dwa sposoby:

  1. cd TheWrongDirectory rm -rf .git

  2. po prostu USUŃ folder .git i przejdź do odpowiedniego katalogu.

V. Rance
źródło