Jak utworzyć zdalne repozytorium Git z lokalnego?

243

Mam lokalne repozytorium Git. Chciałbym udostępnić go na zdalnym serwerze z obsługą ssh. Jak mam to zrobic?

Czapki
źródło

Odpowiedzi:

288

Wydaje mi się, że tworzysz puste repozytorium po stronie zdalnej git init --bare, dodajesz stronę zdalną jako moduł do śledzenia push / pull dla lokalnego repozytorium ( git remote add origin URL), a następnie po prostu mówisz lokalnie git push origin master. Teraz każde inne repozytorium może pullpochodzić ze zdalnego repozytorium.

Kerrek SB
źródło
@ Nips: tak, dobrze, przepraszam. Rzeczywiście pchasz poszczególne gałęzie!
Kerrek SB,
Co jeśli korzystam z GUI? Jak mogę skonfigurować serwer dla wszystkich repozytoriów i każdy komputer w tej samej sieci może się z tym połączyć?
SearchForKnowledge
4
jeśli się git push origin masternie powiedzie z błędem „nie znaleziono repozytorium”, spróbuj git update-server-infopo drugiej stronie, tam gdzie to zrobiłeśgit init --bare
HongKilDong
7
@KrekrekSB jest możliwe automatyczne utworzenie nagiego repozytorium na serwerze, gdy tylko uruchomię git push origin master na moim lokalnym
ANinJa
@HongKilDong Próbowałem, git update-server-infoale dostaję błąd fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
Nayef
81

Aby wstępnie skonfigurować dowolny serwer Git, musisz wyeksportować istniejące repozytorium do nowego nagiego repozytorium - repozytorium, które nie zawiera katalogu roboczego. Jest to na ogół proste do zrobienia. Aby sklonować swoje repozytorium w celu utworzenia nowego pustego repozytorium, uruchom polecenie klonowania z --bareopcją. Zgodnie z konwencją, puste katalogi repozytoriów kończą się w następujący .gitsposób:

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

To polecenie pobiera samo repozytorium Git, bez katalogu roboczego, i tworzy katalog specjalnie dla niego.

Teraz, gdy masz już kopię repozytorium, wystarczy, że umieścisz ją na serwerze i skonfigurujesz protokoły. Załóżmy, że masz skonfigurowany serwer o nazwie git.example.comSSH i chcesz przechowywać wszystkie repozytoria Git w /opt/gitkatalogu. Możesz skonfigurować nowe repozytorium, kopiując swoje repozytorium na:

$ scp -r my_project.git [email protected]:/opt/git

W tym momencie inni użytkownicy, którzy mają dostęp SSH do tego samego serwera, który ma dostęp do odczytu /opt/gitkatalogu, mogą sklonować repozytorium, uruchamiając

$ git clone [email protected]:/opt/git/my_project.git

Jeśli użytkownik SSH łączy się z serwerem i ma dostęp do zapisu do /opt/git/my_project.gitkatalogu, będzie również automatycznie miał dostęp push. Git automatycznie doda uprawnienia do zapisu grupowego do repozytorium, jeśli uruchomisz polecenie git init z --sharedopcją.

$ ssh [email protected]
$ cd /opt/git/my_project.git
$ git init --bare --shared

Bardzo łatwo jest pobrać repozytorium Git, utworzyć gołą wersję i umieścić na serwerze, do którego ty i twoi współpracownicy macie dostęp SSH. Teraz jesteś gotowy do współpracy przy tym samym projekcie.

Binoy Babu
źródło
6
scpRozwiązanie działa w praktyce IMO lepiej niż z init --bare. Nadal wydaje się to brzydkim hackowaniem, ale najpierw klonuje się lokalnie, a następnie kopiuje na serwer ... żałuję, że git nie ma polecenia, aby to zrobić za jednym razem.
leftaroundabout
1
Dałem +1 temu, ponieważ --sharedpracował dla mnie. Zastanawiam się, co się stanie, jeśli użyjesz go git init --sharedbez zrobienia --barejednego ...
lodowatej wody
1
Utwórz lokalne repozytorium lokalnie scp, aby zdalne git init --baredziałało lepiej, jeśli pilot nie obsługuje (tak jak w przypadku git 1.5.5, 2008). Myślę, że to powinno zadziałać, nawet jeśli pilot nie ma w ogóle git.
Yaroslav Nikitenko
1
Odniesienie: git-scm.com/book/en/v1/…
berbt
1
drobna uwaga: krok scp rozwiązania jest poprawny, ale działa, jeśli zdalny użytkownik ma zwykłą powłokę, jeśli użytkownik używa powłoki git, nie będzie działać.
user1708042
9

Uwaga dla osób, które utworzyły lokalną kopię w systemie Windows i chcą utworzyć odpowiednie zdalne repozytorium w systemie z linią uniksową, w której pliki tekstowe uzyskują zakończenia LF na dalszych klonach przez programistów systemów uniksopodobnych, ale zakończenia CRLF w systemie Windows.

Jeśli utworzyłeś repozytorium Windows przed skonfigurowaniem tłumaczenia na końcu linii, masz problem. Domyślnym ustawieniem Gita jest brak tłumaczenia, więc twój zestaw roboczy używa CRLF, ale twoje repozytorium (tj. Dane przechowywane w .git) również zapisało pliki jako CRLF.

Po naciśnięciu przycisku na pilocie zapisane pliki są kopiowane w niezmienionej postaci, nie następuje tłumaczenie końca wiersza. (Tłumaczenie końca linii występuje, gdy pliki są zatwierdzane do repozytorium, a nie po wypchnięciu repozytoriów). Skończysz z CRLF w swoim uniksowym repozytorium, co nie jest tym, czego chcesz.

Aby uzyskać LF w zdalnym repozytorium, musisz najpierw upewnić się, że LF znajduje się w lokalnym repozytorium, poprzez ponowną normalizację repozytorium Windows . Nie będzie to miało żadnego widocznego wpływu na zestaw roboczy systemu Windows, który nadal ma zakończenia CRLF, jednak po naciśnięciu przycisku na pilocie pilot uzyska poprawnie LF.

Nie jestem pewien, czy istnieje łatwy sposób na określenie, jakie zakończenia linii masz w repozytorium Windows - Myślę, że możesz to przetestować, ustawiając core.autocrlf = false, a następnie klonując (jeśli repo ma zakończenia LF, klon będzie miał LF też).

użytkownik1804620
źródło
5

Istnieje interesująca różnica między dwoma popularnymi powyższymi rozwiązaniami:

  1. Jeśli utworzysz puste repozytorium w ten sposób:

    cd / outside_of_any_repo
    mkdir my_remote.git
    cd my_remote.git
    git init --bare
    

i wtedy

cd  /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master

Następnie git konfiguruje konfigurację w 'original_repo' z tą relacją:

original_repo origin --> /outside_of_any_repo/my_remote.git/

z tym ostatnim jako zdalnym nadrzędnym. A pilot nadrzędny nie ma żadnych innych pilotów w swojej konfiguracji.

  1. Jeśli jednak zrobisz to na odwrót:

    (z katalogu original_repo)
    Płyta CD ..
    git clone --bare original_repo /outside_of_any_repo/my_remote.git
    

następnie „my_remote.git” kończy się, a jego konfiguracja ma „origin” skierowaną z powrotem do „original_repo” jako pilota, a remote.origin.url odpowiada ścieżce katalogu lokalnego, co może nie być odpowiednie, jeśli ma zostać przeniesiony do serwera.

Chociaż tego „zdalnego” odniesienia można łatwo pozbyć się później, jeśli nie jest odpowiednie, „original_repo” wciąż musi być skonfigurowane tak, aby wskazywało „my_remote.git” jako zdalny up-stream (lub dokądkolwiek zmierza do udostępnienia). Technicznie można osiągnąć ten sam wynik kilkoma krokami dzięki podejściu nr 2. Ale nr 1 wydaje się być bardziej bezpośrednim podejściem do tworzenia „centralnego nagiego wspólnego repozytorium” pochodzącego z lokalnego, odpowiedniego do przeniesienia na serwer, przy mniejszej liczbie kroków. Myślę, że zależy to od roli, jaką ma odgrywać zdalne repozytorium. (I tak, jest to sprzeczne z dokumentacją tutaj .)

Zastrzeżenie: Nauczyłem się powyższego (podczas tego pisania na początku sierpnia 2019 r.), Wykonując test na moim systemie lokalnym z prawdziwym repozytorium, a następnie porównując wyniki między plikami. Ale! Wciąż się uczę, więc może być lepszy sposób. Ale moje testy pomogły mi stwierdzić, że nr 1 jest moją obecnie preferowaną metodą.

V. Wheeler
źródło
4

Zdalne repozytorium jest zasadniczo zwykłym repozytorium - repozytorium Git, które nie ma katalogu roboczego. Ponieważ repozytorium jest używane tylko jako punkt współpracy, nie ma powodu, aby migawka była sprawdzana na dysku; to tylko dane Git. Mówiąc najprościej, samo repozytorium to zawartość katalogu .git twojego projektu i nic więcej.

Możesz utworzyć zwykłe repozytorium git z następującym kodem:

$ git clone --bare /path/to/project project.git

Jedną z opcji posiadania zdalnego repozytorium git jest użycie protokołu SSH:

Wspólny protokół transportowy dla Git, gdy samo hostowanie jest po SSH. Wynika to z faktu, że dostęp SSH do serwerów jest już skonfigurowany w większości miejsc - a jeśli tak nie jest, łatwo to zrobić. SSH jest także uwierzytelnionym protokołem sieciowym, a ponieważ jest wszechobecny, ogólnie jest łatwy do skonfigurowania i używania.

Aby sklonować repozytorium Git przez SSH, możesz podać ssh://adres URL w następujący sposób:

$ git clone ssh://[user@]server/project.git

Lub możesz użyć krótszej składni SCP dla protokołu SSH:

$ git clone [user@]server:project.git

W obu powyższych przypadkach, jeśli nie określisz opcjonalnej nazwy użytkownika, Git zakłada użytkownika, którego jesteś zalogowany jako.

Profesjonaliści

Istnieje wiele zalet korzystania z SSH. Po pierwsze, SSH jest stosunkowo łatwy w konfiguracji - demony SSH są powszechne, wielu administratorów sieci ma z nimi doświadczenie, a wiele dystrybucji systemu operacyjnego jest skonfigurowanych z nimi lub ma narzędzia do zarządzania nimi. Następnie dostęp przez SSH jest bezpieczny - cały transfer danych jest szyfrowany i uwierzytelniany. Wreszcie, podobnie jak protokoły HTTPS, Git i lokalne, SSH jest wydajny, dzięki czemu dane są możliwie jak najmniejsze przed ich przesłaniem.

Wady

Negatywnym aspektem SSH jest to, że nie obsługuje anonimowego dostępu do Twojego repozytorium Git. Jeśli używasz SSH, ludzie muszą mieć dostęp SSH do twojego komputera, nawet w trybie tylko do odczytu, co nie sprawia, że ​​SSH sprzyja projektom typu open source, w których ludzie mogą po prostu chcieć sklonować twoje repozytorium, aby je zbadać. Jeśli używasz go tylko w sieci firmowej, SSH może być jedynym protokołem, z którym musisz sobie poradzić. Jeśli chcesz zezwolić na anonimowy dostęp tylko do odczytu do swoich projektów, a także chcesz korzystać z SSH, musisz skonfigurować SSH, abyś mógł je przesuwać, ale coś innego, z czego inni mogliby pobierać.

Aby uzyskać więcej informacji, sprawdź odniesienie: Git on the Server - The Protocols

Amirhossein72
źródło
3

Musisz utworzyć katalog na zdalnym serwerze. Następnie użyj polecenia „git init”, aby ustawić je jako repozytorium. Należy to zrobić dla każdego nowego projektu (każdego nowego folderu)

Zakładając, że już skonfigurowałeś i używałeś git za pomocą kluczy ssh, napisałem mały skrypt Pythona, który po uruchomieniu z katalogu roboczego skonfiguruje pilota i zainicjuje katalog jako repozytorium git. Oczywiście będziesz musiał edytować skrypt (tylko raz), aby podać serwer i ścieżkę root dla wszystkich repozytoriów.

Sprawdź tutaj - https://github.com/skbobade/ocgi

Sam
źródło
-3

Zwykle można skonfigurować repozytorium git za pomocą initpolecenia

git init

W twoim przypadku jest już dostępne repo na pilocie. W zależności od sposobu uzyskania dostępu do zdalnego repozytorium (z nazwą użytkownika w adresie URL lub kluczem ssh, który obsługuje weryfikację), użyj tylko clonepolecenia:

git clone git@[my.url.com]:[git-repo-name].git

Istnieją również inne sposoby klonowania repozytorium. W ten sposób wywołujesz go, jeśli masz na komputerze konfigurację klucza ssh, która weryfikuje ściągnięcie repozytorium. Istnieją inne kombinacje adresu URL, jeśli chcesz podać hasło i nazwę użytkownika, aby zalogować się do zdalnego repozytorium.

Alex Cio
źródło
1
jakie to ironiczne ... ktoś właśnie dziś zanegował tę odpowiedź, a teraz mam problemy z wypychaniem moich plików. Wygląda na to, że potrzebuję trochę ćwiczeń git, aby ponownie się do tego przyłączyć!
Alex Cio
7
Myślę, że problem polega na tym, że OP szukał rozwiązania umożliwiającego utworzenie zdalnego repo na serwerze ssh, ale opisałeś, jak utworzyć lokalne repo ze zdalnego serwera ssh. Nie odpowiedziałeś na pytanie. (Nie byłem na dole.)
Peter - Przywróć Monikę