Odpowiedzi:
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 pull
pochodzić ze zdalnego repozytorium.
git push origin master
nie powiedzie z błędem „nie znaleziono repozytorium”, spróbuj git update-server-info
po drugiej stronie, tam gdzie to zrobiłeśgit init --bare
git update-server-info
ale dostaję błąd fatal: 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:
$ 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.com
SSH i chcesz przechowywać wszystkie repozytoria Git w /opt/git
katalogu. Możesz skonfigurować nowe repozytorium, kopiując swoje repozytorium na:
$ scp -r my_project.git user@git.example.com:/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/git
katalogu, mogą sklonować repozytorium, uruchamiając
$ git clone user@git.example.com:/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.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ą.
$ ssh user@git.example.com
$ 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.
scp
Rozwią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.
--shared
pracował dla mnie. Zastanawiam się, co się stanie, jeśli użyjesz go git init --shared
bez zrobienia --bare
jednego ...
scp
, aby zdalne git 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ż).
Istnieje interesująca różnica między dwoma popularnymi powyższymi rozwiązaniami:
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.
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ą.
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
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
Zwykle można skonfigurować repozytorium git za pomocą init
polecenia
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 clone
polecenia:
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.