Mam lokalne repozytorium Git. Chciałbym udostępnić go na zdalnym serwerze z obsługą ssh. Jak mam to zrobic?
git
installation
Czapki
źródło
źródło
git push origin master
nie powiedzie z błędem „nie znaleziono repozytorium”, spróbujgit update-server-info
po drugiej stronie, tam gdzie to zrobiłeśgit init --bare
git update-server-info
ale dostaję błądfatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
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
--bare
opcją. Zgodnie z konwencją, puste katalogi repozytoriów kończą się w następujący.git
sposób: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.com
SSH i chcesz przechowywać wszystkie repozytoria Git w/opt/git
katalogu. Możesz skonfigurować nowe repozytorium, kopiując swoje repozytorium na:W tym momencie inni użytkownicy, którzy mają dostęp SSH do tego samego serwera, który ma dostęp do odczytu
/opt/git
katalogu, mogą sklonować repozytorium, uruchamiającJeśli użytkownik SSH łączy się z serwerem i ma dostęp do zapisu do
/opt/git/my_project.git
katalogu, 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--shared
opcją.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.
źródło
scp
Rozwiązanie działa w praktyce IMO lepiej niż zinit --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.--shared
pracował dla mnie. Zastanawiam się, co się stanie, jeśli użyjesz gogit init --shared
bez zrobienia--bare
jednego ...scp
, aby zdalnegit init --bare
dział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.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ż).
źródło
Istnieje interesująca różnica między dwoma popularnymi powyższymi rozwiązaniami:
Jeśli utworzysz puste repozytorium w ten sposób:
i wtedy
Następnie git konfiguruje konfigurację w 'original_repo' z tą relacją:
z tym ostatnim jako zdalnym nadrzędnym. A pilot nadrzędny nie ma żadnych innych pilotów w swojej konfiguracji.
Jeśli jednak zrobisz to na odwrót:
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ą.
źródło
Możesz utworzyć zwykłe repozytorium git z następującym kodem:
Jedną z opcji posiadania zdalnego repozytorium git jest użycie protokołu SSH:
Aby uzyskać więcej informacji, sprawdź odniesienie: Git on the Server - The Protocols
źródło
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
źródło
Zwykle można skonfigurować repozytorium git za pomocą
init
poleceniaW 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
clone
polecenia: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.
źródło