Jak przenieść repozytorium git do innego katalogu i uczynić ten katalog repozytorium git?

101

Mam katalog gitrepo1 . Ten katalog jest repozytorium git.

  • Chciałbym przenieść ten plik gitrepo1 do innego katalogu newrepo .

  • Katalog newrepo powinien być nowym repozytorium git bez utraty historii git i powinien zawierać katalog gitrepo1 .

  • Katalog gitrepo1 powinien być teraz po prostu katalogiem (wewnątrz newrepo ), bez żadnego .gitindeksu, tj. NIE powinien już być niezależnym repozytorium git ani podmodułem.

W jaki sposób mogę to zrobić?

Pranjal Mittal
źródło
9
mv girepo1 newrepo??
ddavison

Odpowiedzi:

110

To jest bardzo proste. Git nie dba o to, jaka jest nazwa jego katalogu. Dba tylko o to, co jest w środku. Możesz więc po prostu zrobić:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Zwróć uwagę, że kopia jest dość droga, jeśli repozytorium jest duże i ma długą historię. Możesz tego łatwo uniknąć:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Po utworzeniu newrepomiejsce docelowe, które chcesz umieścić, gitrepo1może znajdować się w dowolnym miejscu, nawet w środku, newrepojeśli chcesz. Nie zmienia procedury, tylko ścieżkę, którą piszesz gitrepo1.

Shahbaz
źródło
6
+1. Prawdopodobnie warto wspomnieć o tym problemie, który dotyczy repozytoriów utworzonych za pomocą git w wersji 1.7.8 lub 1.7.9 - co może oznaczać, że przeniesienie repozytorium git sprawia, że ​​jest ono bezużyteczne (choć, jak wskazano, łatwo je naprawić).
AD7six
1
Jestem na maszynie wndows i używam wiersza polecenia. nie mogłem znaleźć polecenia „cp”. czy polecenie „cp” jest specyficzne dla innego systemu operacyjnego?
LP13
1
@ user3862378, cppodobnie jak prawie każde polecenie lub funkcja jest specyficzna dla innych systemów operacyjnych. W rzeczywistości jest to specyficzne dla każdego systemu operacyjnego, który nie jest systemem Windows. Spróbuj zadzwonić do firmy Microsoft i zapytać, dlaczego nie są zgodne z POSIX. W każdym razie cpoznacza kopię. mvoznacza ruch. rmoznacza usunąć. Możesz znaleźć odpowiedniki systemu Windows.
Shahbaz
@Shahbaz Dzięki, powyższe rozwiązanie tworzy następującą strukturę „newrepo ->. Git” i „newrepo-> wszystkie inne pliki z gitrepo1”… nie umieszcza folderu „gitrepo1” w „newrepo” .. jestem ciekawy, czy ręczne tworzenie folderów w systemie Windows i przenoszenie folderu „.git” do folderu głównego… czy działałoby bez wpływu na historię?
LP13
2
@ user3862378, nie ma powodu, dla którego nie powinno. .git/zawiera całą historię, w tym ostatnie zatwierdzenie. Gdziekolwiek to umieścisz, masz całą historię. W rzeczywistości, jeśli wszystkie pliki w tym katalogu różnią się od oryginalnego repozytorium, z którego wziąłeś .git/, jedyną rzeczą byłoby to, że informuje cię, że niektóre pliki zostały usunięte, a niektóre nie są śledzone. Z a git reset --hard, usunięte pliki zostaną automatycznie odzyskane! Należy tylko zauważyć, że po prostu kopiując .git/nie można odzyskać niezatwierdzonych zmian.
Shahbaz
4

Trochę późno i na pytanie już udzielono odpowiedzi, ale żeby to zrobić bez bólu głowy:

  1. Sprawdź co nowego obecny oddział cię w starszej folderze git z git status, powiedzmy gałąź rozwoju
  2. Zmień katalog na nowy folder git, a następnie git cloneprojekt z repozytorium do nowego folderu
  3. Sprawdź bieżącą gałąź w nowym folderze: git checkout development
  4. Zsynchronizuj nowy folder ze starszym, używając rsync, oprócz folderu .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Wtedy możesz kontynuować od miejsca, w którym skończyłeś

emremrah
źródło
2

To jeszcze prostsze. Właśnie to zrobiłem (w systemie Windows, ale powinno działać w innym systemie operacyjnym):

  1. Utwórz newrepo .
  2. Przenieś gitrepo1 do newrepo .
  3. Przenieś .git z gitrepo1 do newrepo (o jeden poziom wyżej).
  4. Zatwierdź zmiany (śledzenie poprawek zgodnie z wymaganiami).

Git po prostu widzi, że dodałeś katalog i zmieniłeś nazwę kilku plików. Nic takiego.

david.pfx
źródło
1

Nie jestem ekspertem, ale kopiuję folder .git do nowego folderu, a następnie wywołuję: git reset --HARD

Uruchom ponownie Wszechświat
źródło