Jak zduplikować repozytorium Git? (bez rozwidlenia)

117

Mam dwa repozytoria i muszę skopiować jeden na drugi, pusty, który ma inne poziomy dostępu niż pierwszy. Kopia i repozytorium macierzyste nie powinny być ze sobą połączone.

Jestem nowy w git i byłoby wspaniale, gdyby ktoś mógł mi w tym pomóc.

Kowboj Bebop
źródło
5
Nie jestem pewien, ale myślę, że możesz go po prostu sklonować, a następnie użyć git config remote.origin.url git: //new.url/proj.git, aby ustawić remote.origin na nowego rep.
Rufinus,
tak, link, który właśnie opublikowałem, robi coś takiego.
nbz
@rudinus Właśnie to zrobiłem. Dzięki.
cowboybebop

Odpowiedzi:

205

Zobacz https://help.github.com/articles/duplicating-a-repository

Krótka wersja:

Aby wykonać dokładny duplikat, musisz wykonać zarówno nagi klon, jak i wypychanie lustrzane:

mkdir foo; cd foo 
# move to a scratch dir

git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

cd ..
rm -rf old-repository.git  
# Remove our temporary local repository

UWAGA: powyższe będzie działać dobrze z każdym zdalnym repozytorium git, instrukcje nie są specyficzne dla github

Powyższe tworzy nową zdalną kopię repozytorium. Następnie sklonuj go do działającej maszyny.

Larry K.
źródło
2
Co się stanie, jeśli stare i nowe repozytoria miały taką samą nazwę (nie ten sam adres URL git). Tak jak w, po prostu Jeremy.gitJeremy.git
klonuję
To nie będzie dokładny duplikat. Problemy nie zostaną przeniesione.
Slam
Czy to zachowuje historię?
Thomas
@Thomas Właśnie to zrobiłem i tak, zachowałem całą moją historię w kopii. Zauważ, że po wciśnięciu i cd do nowego repozytorium nadal nic tam nie ma, ponieważ wcisnąłeś do pilota, więc musisz wyciągnąć
PfunnyGuy
7
Aby ta odpowiedź działała z GitHubem, należy najpierw utworzyć nowe repozytorium na GitHub.
Alex Holcombe
23

Możesz także użyć git-copy .

Zainstaluj go za pomocą Gem,

gem install git-copy

Następnie

git copy https://github.com/exampleuser/old-repository.git \
    https://github.com/exampleuser/new-repository.git
Quanlong
źródło
1
Jak w pierwszej kolejności zainstalować klejnot? Wydaje się, że jest to najbardziej bezproblemowe rozwiązanie. Głosowano!
saran3h
Zwykle jest częścią instalacji Rubiego. Na Ubuntu zrób sudo apt install ruby.
szkoda
10

Jeśli kopiujesz do GitHub, możesz skorzystać z importera GitHub, aby zrobić to za Ciebie. Oryginalne repozytorium może pochodzić nawet z innych systemów kontroli wersji.

Mateus Gondim
źródło
4
Działa to doskonale, a nawet zachowuje historię - powinno być wyżej głosowane
John D
1
Zgadzam się. To podejście jest znacznie bardziej intuicyjne, można to zrobić całkowicie w interfejsie GUI Github i nie wiąże się z żadnym z tych mylących bzdur z wiersza poleceń. Kroki: 1) W graficznym interfejsie użytkownika utwórz nowe repozytorium, ale nie zaznaczaj pola wyboru „Zainicjuj to repozytorium za pomocą pliku README”. Po wykonaniu tej czynności Github wyświetli nową stronę i opcję oznaczoną „… lub importuj kod z inne repozytorium. " Otóż ​​to!
Luke F.
5

Jeśli chcesz po prostu utworzyć nowe repozytorium, używając wszystkich lub większości plików z istniejącego (tj. Jako rodzaj szablonu), uważam, że najłatwiejszym podejściem jest utworzenie nowego repozytorium o żądanej nazwie itp., Sklonuj je do na pulpicie, a następnie po prostu dodaj pliki i foldery, które chcesz w nim umieścić.

Nie masz całej historii itp., Ale prawdopodobnie nie chcesz tego w tym przypadku.

tim
źródło
-1

Otwórz terminal.

Utwórz czysty klon repozytorium.

git clone --bare https://github.com/exampleuser/old-repository.git

Mirror-push to the new repository.

cd stare repozytorium.git

git push --mirror https://github.com/exampleuser/new-repository.git

Kundan Roy
źródło
Próbowałem twojego podejścia. Otrzymałem ten komunikat o błędzie:! [zdalne odrzucenie] master -> master (odebranie połączenia odrzucone) i kilka innych podobnych wiadomości. Ostatni był: błąd: nie udało się wysłać niektórych referencji. Jak mogę to poprawić?
LND