Czy wypchnąłeś istniejące repo na nowy i inny zdalny serwer repo?

494

Załóżmy, że mam repozytorium na git.fedorahosted.org i chcę sklonować to na moim koncie w github, aby mieć własny plac zabaw oprócz bardziej „oficjalnego” repo na fedorahosted. Jakie byłyby kroki, aby na początku to skopiować? W githubie znajduje się ładny przycisk „rozwidlenia”, ale nie mogę go używać z oczywistych powodów.

A jak śledzę zmiany w repozytorium fedorahosted w githubie?

Heiko Rupp
źródło

Odpowiedzi:

751
  1. Utwórz nowe repo w github.
  2. Sklonuj repozytorium z fedorahosted na lokalną maszynę.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Teraz możesz z nim pracować, tak jak każde inne repozytorium github. Aby pobrać łatki z góry, po prostu uruchom git pull upstream master && git push origin master.

troelskn
źródło
14
Nie ma powodu, aby zmieniać nazwę oryginalnego pochodzenia, wystarczy nazwać nowy plac zabaw czymś innym.
tacaswell
34
@ tcaswell Technicznie nie, ale jest to silna konwencja, która originwskazuje na kanoniczną zdalną lokalizację. W tym przypadku lokalizacja github byłaby prawdopodobnie kanoniczna.
troelskn
1
Uważam, że „upstream” to kanoniczne miejsce, ale myślę, że zaczyna się to dzielić włosy.
tacaswell
3
Może powinienem zadać inne pytanie, ale myślę, że rozmawiacie o tym, czego chcę. Chciałbym dodać nowy pilot, nie zastępując istniejącego, aby móc nadal pobierać ze starego repozytorium, ale przesyłać wszelkie zmiany do nowego.
ThatAintWorking
13
@ThatAintWorking Prawdopodobnie powinieneś otworzyć nowe pytanie, ale w skrócie - możesz dodać dowolną liczbę pilotów za pomocą polecenia git remote add. Następnie możesz przejść do jednego z nich, wyraźnie wpisując pilota git push. Np. git push foobar masterDo popchnięcia bieżącej gałęzi masterna zdalnie foobar.
troelskn
108

Na to pytanie została usunięta odpowiedź, która zawierała przydatny link: https://help.github.com/articles/duplicating-a-repository

Istotą jest

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location

Przykład PO:

Na twoim komputerze lokalnym

$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git
tłum
źródło
5
Jaka jest korzyść z odsłonięcia klonu i zwierciadła po prostu dodając i pchając do innego pilota? Czy to dlatego, że wszystkie gałęzie zostaną przesunięte, a nie tylko bieżąca gałąź? (Jeśli tak, wydaje się to ograniczeniem przyjętej odpowiedzi, na którą należy zwrócić uwagę.)
yoyo
3
To było dokładnie to, czego szukałem, a --bare / --mirror to zwykle to, co ludzie chcą zrobić! To ważna odpowiedź! Dzięki
claf
1
Świetny! Zdecydowanie najbardziej poprawna odpowiedź na pytanie tematyczne. Dzięki! Jeśli nie robię tego w ten sposób, zawsze dostajęerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin
45

Aby zmienić istniejące repozytorium w inne, musisz:

  1. Najpierw sklonuj oryginalne repozytorium.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Wciśnij sklonowane źródła do nowego repozytorium:

    cd rhq
    git push https://github.com/user/example master:master
    

Możesz zmienić się master:masterw source:destinationoddział.


Jeśli chcesz przekazać określone zatwierdzenie (gałąź), wykonaj następujące czynności:

  1. Na oryginalnym repozytorium utwórz i przejmij nowy oddział:

    git checkout -b new_branch
    
  2. Wybierz i zresetuj do punktu, od którego chcesz zacząć:

    git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    Alternatywnie wybierz zatwierdzenie przez, git cherry-pickaby dołączyć do istniejącej HEAD.

  3. Następnie przejdź do nowego repozytorium:

    git push https://github.com/user/example new_branch:master
    

    Jeśli korzystasz -fz bazy, użyj opcji forsowania (niezalecane). Uruchom, git reflogaby zobaczyć historię zmian.

kenorb
źródło
2
git push ... old_branch_name:new_branch_namepozwala naciskać gałąź funkcji ze starego repozytorium jako główny oddział w nowym repozytorium. Przydatne!
gorjanz
To był dla mnie najprostszy sposób.
Adam,
15

Czy naprawdę chcesz po prostu wypchnąć lokalne repozytorium (wraz z jego lokalnymi oddziałami itp.) Do nowego pilota, czy naprawdę chcesz skopiować stary pilot (ze wszystkimi jego gałęziami, tagami itp.) Na nowym pilocie? Jeśli ten ostatni jest świetnym blogiem na temat prawidłowego kopiowania repozytorium git .

Gorąco zachęcam do przeczytania bloga w celu zapoznania się z bardzo ważnymi szczegółami, ale krótka wersja jest następująca:

W nowym katalogu uruchom następujące polecenia:

git clone --mirror [email protected]/upstream-repository.git
cd upstream-repository.git
git push --mirror [email protected]/new-location.git
Sierść psa
źródło
Myślę, że to jest link: blog.plataformatec.com.br/2013/05/…
David
11

Spróbuj tego Jak przenieść pełne repozytorium Git

  1. Utwórz lokalne repozytorium w katalogu temp-dir, używając:

    git clone temp-reż

  2. Przejdź do katalogu temp-dir.

  3. Aby zobaczyć listę różnych gałęzi w ORI:

    git branch -a
    
  4. Przejdź do wszystkich gałęzi, które chcesz skopiować z ORI do NOWEGO, używając:

    git checkout branch-name
    
  5. Teraz pobierz wszystkie tagi z ORI, używając:

    git fetch --tags
    
  6. Przed wykonaniem następnego kroku sprawdź lokalne tagi i gałęzie, używając następujących poleceń:

    git tag
    
    
    git branch -a
    
  7. Teraz wyczyść łącze do repozytorium ORI za pomocą następującego polecenia:

    git remote rm origin
    
  8. Teraz połącz swoje lokalne repozytorium z nowo utworzonym NOWYM repozytorium za pomocą następującego polecenia:

    git remote add origin <url to NEW repo>
    
  9. Teraz wypchnij wszystkie swoje gałęzie i tagi za pomocą tych poleceń:

    git push origin --all
    
    
    git push --tags
    
  10. Masz teraz pełną kopię z repozytorium ORI.

vm345
źródło
9

Znalazłem rozwiązanie za pomocą set-url, które jest zwięzłe i dość łatwe do zrozumienia :

  1. utwórz nowe repozytorium w Github
  2. cd do istniejącego repozytorium na komputerze lokalnym (jeśli jeszcze go nie sklonowałeś, zrób to najpierw)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master
Mobiletainment
źródło
9

Jeśli masz istniejące repozytorium Git:

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/newproject
git push -u origin --all
git push -u origin --tags
Kamil Nekanowicz
źródło
1
Dla wyjaśnienia: - wszyscy popchną wszystkie gałęzie
GilCol
7

Po prostu wskaż nowe repozytorium, zmieniając adres URL repozytorium GIT za pomocą tego polecenia:

git remote set-url origin [new repo URL]

Przykład: git remote set-url origin [email protected]:Batman/batmanRepoName.git

Teraz pchanie i ciągnięcie jest powiązane z nowym REPO.

Następnie pchnij normalnie tak:

git push -u origin master
Abdel Ourimchi
źródło
2

Miałem ten sam problem.

W moim przypadku, ponieważ mam oryginalne repozytorium na moim komputerze lokalnym, utworzyłem kopię w nowym folderze bez ukrytego pliku (.git, .gitignore).

Wreszcie dodałem plik .gitignore do nowo utworzonego folderu.

Następnie utworzyłem i dodałem nowe repozytorium ze ścieżki lokalnej (w moim przypadku za pomocą GitHub Desktop).

itrascastro
źródło
1

Oto ręczny sposób git remote set-url origin [new repo URL]:

  1. Sklonuj repozytorium: git clone <old remote>
  2. Utwórz repozytorium GitHub
  3. otwarty <repository>/.git/config

    $ git config -e
    
    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = <old remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    i zmień pilota (opcja url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Przekaż repozytorium do GitHub: git push

Możesz także używać obu / wielu pilotów .

upe
źródło
Szukałem tego samego problemu, a potem zrobiłem to samo i wypracowałem.
Mohit Patidar