Jak utworzyć nowe repozytorium GitHub z oddziału w istniejącym repozytorium?

170

Mam gałęzie główne i nowe projekty . A teraz chciałbym stworzyć zupełnie nowe repozytorium z jego wzorcem opartym na gałęzi nowego projektu.

Kontekst: Mam jedno repozytorium, które zawiera trzy niezależne aplikacje. Tak się nie zaczęło. Pierwotnie w repozytorium była tylko jedna aplikacja. Z biegiem czasu jednak potrzeby biznesowe uległy zmianie. Jedna aplikacja stała się dwiema (starsza wersja i ponownie napisana). Dodano usługę sieciową. Trzy projekty zostały umieszczone w oddzielnych gałęziach. Jednak nie udostępniają żadnego kodu. Dlatego łatwiej byłoby je podzielić na własne repozytoria.

Dogweather
źródło

Odpowiedzi:

294

Zacząłem od pomysłu @ user292677 i udoskonaliłem go, aby rozwiązać mój problem:

  1. Utwórz nowe repozytorium na githubie.
  2. cd do lokalnej kopii starego repozytorium, z którego chcesz wyodrębnić, skonfigurowanego do śledzenia gałęzi nowego projektu, która stanie się głównym repozytorium nowego repozytorium .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

Nowe repozytorium Github zostało ukończone. Wynik to;

  • nowe repozytorium Github o nazwie new-repo ,
  • który masterodpowiada nowemu projektowi starego repozytorium z
  • cała historia zachowana.

W rzeczywistości odkryłem, że używając tej metody, mogę utworzyć nowe repozytorium z ręcznie wybranymi gałęziami, zmienionymi tak, jak chciałem:

$ git push [email protected]:accountname/new_repo +new-project:master +site3a:rails3

W rezultacie istniejąca wcześniej gałąź site3a została również przeniesiona do nowego repozytorium i pojawi się jako rails3 . Działa to naprawdę dobrze: schemat sieci pokazuje nowy master i rails3 z pełną historią oraz w ich prawidłowych relacjach ze sobą.

Aktualizacja 2013-12-07: Użyłem tego z innym projektem i zweryfikowałem, że ten przepis nadal działa.

Aktualizacja 2018-01-11: Zaktualizowano krok 3, aby użyć zalecenia GitHub dla protokołu https. Przepis nadal działa.

Dogweather
źródło
Cześć @Dogweather, dzięki za udostępnienie tego. czy możesz wyjaśnić, jaka jest różnica między twoją metodą i zmienić pierwotny zdalny adres URL, wypchnąć na nową metodę repo?
Vincent
5
Dogweather, korzystałem z twojego rozwiązania częściej, niż pamiętam. Dzięki! Musiałem najpierw sprawdzić old_branch, zanim to zadziałało
Bjorn Theart
3
pamiętaj, że to nie skopiuje tagów. Myślę, że możesz tego potrzebować --follow-tags.
Factor Mystic
1
Zauważ, że nie musisz tworzyć repozytorium na Githubie, możesz po prostu pushdo lokalnego (tj. git initZamiast Github> New> ...)
OJFord
1
Nie chcę przenosić całej mojej historii zmian do nowego repozytorium, chciałem tylko skopiować zmiany należące do repozytorium potomnego. Czy to możliwe ??
Arbaz Rizvi
26

Aktualizacja:

cd do lokalnego repozytorium zawierającego old_branch i:

$ git push https://github.com/accountname/new_repo.git +old_branch:master
Alexey Kislitsin
źródło
9
git clone -b new-project /path/to/repo /new/repo/path

Edycja: w GitHub możesz „rozwidlić” repozytorium, a następnie przejść do karty Administrator w swoim klonie. Pod pozycjami „Nazwa repozytorium” i „Widoczność” znajduje się „Domyślna gałąź” z rozwijanym menu gałęzi. Wybierz new-project.

Ponowna edycja: właśnie zdałem sobie sprawę, że to mastergałąź, którą chcesz ustawić, a nie tylko gałąź „domyślna”. Więc…

  • Na GitHub sklonuj them/repodo you/repo.
  • Biegać git clone [email protected]:you/repo.git
  • Start gitk.
  • [Możesz utworzyć old-mastergałąź, aby nie stracić z oczu starych zatwierdzeń.]
  • Znajdź najnowsze zatwierdzenie w new-projectgałęzi, kliknij prawym przyciskiem myszy komunikat dotyczący zatwierdzenia i wybierz „Zresetuj gałąź główną do tego miejsca”. (Możesz to również zrobić w wierszu poleceń za pomocą git-reset, ale nie wymyśliłem prawidłowego wywołania).

Twoja następna push w górę do repozytorium GitHub będzie musiała zostać wykonana z --forceopcją, ale w przeciwnym razie gotowe.

Jeśli to jedno z Twoich własnych repozytoriów, robisz to, aby…

  • Biegać git clone [email protected]:you/orig.git
  • Biegać git clone orig copy
  • Jak opisałem powyżej, ale z poziomu lokalnego copyrepozytorium, zresetuj mastergałąź do miejsca, w którym chcesz.
  • Utwórz pusty projekt GitHub you/copy. Postępuj zgodnie ze wskazówkami na GitHub, aby skonfigurować ten projekt jako zdalny dla lokalnej wersji copy, push masteri gotowe!
JC Salomon
źródło
Hmm! Nie jestem pewien, jak zrobić pierwszy krok: sklonować repozytorium w githubie. Nie sądzę, żeby to było możliwe.
Dogweather
@Dogweather, na GitHubie nazywa się to „rozwidleniem”; Zredagowałem odpowiedź dla jasności.
JC Salomon
Nie udało mi się znaleźć repozytorium na jednym koncie. Czy próbowałeś tego sam?
Dogweather
5
  1. Utwórz NEW_REPOSITORY na github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

I to wszystko. (Uwaga: zachowana historia git)

Wypróbowałem odpowiedź powyżej i stwierdziłem, że nie jest ona wystarczająco konkretna, ponieważ nie określała + master: master, czyli tego, czego potrzebowałem, aby działała. Działa świetnie.

Źródło (z moimi modyfikacjami w celu uniknięcia problemów z SSH w github): Mauricio Aiello, były starszy programista Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branch-in-an-existing-repository

Joe
źródło
W rzeczywistości jest to bardziej użyteczne niż zaakceptowana odpowiedź. Działa nawet w sytuacjach, w których Git narzeka na błędy src refspec, gdy nie udaje się przesłać starego do nowego repozytorium.
Informagic
2

Nie jestem pewien, czy to dobry sposób, ale i tak jest to łatwe:

git clone -b new-project [email protected]:User/YourProject.git newProjcet

Następnie utwórz nowe repozytorium na githubie i wypchnij je.

Kjuly
źródło
2

Pamiętając, że kiedy po prostu tworzysz nowe repozytorium, tracisz odniesienie do starego i utrudniasz utrzymanie aktualizacji oryginalnego projektu zsynchronizowanej z nowym. Może nie lepiej jest rozwidlić repozytorium?

Julio Flores
źródło
0

Mały dodatek do poprawnej odpowiedzi:

$ git push [email protected]: nazwa_konta / new_repo + old_branch: master

"[email protected]: nazwa konta / new_repo" => pobierz z github "Klonuj lub pobierz" menu rozwijane

Gerd
źródło