git klon przez ssh


233

Mam projekt, w którym utworzyłem repozytorium git:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

Chciałem stworzyć goły klon na innej maszynie:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

Wykonałem klon, ale nie wydrukowałem żadnej odpowiedzi. Zalogowałem się na maszynie serwerowej i próbowałem zobaczyć, jak są przechowywane pliki. Ścieżka / GitRepos była pusta, więc postanowiłem zrobić klon ponownie:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

Tym razem odpowiedź brzmiała:

fatal: ścieżka docelowa 'ssh: // użytkownik @ serwer: /GitRepos/myproject.git' już istnieje i nie jest pustym katalogiem.

Ale widziałem, że ścieżka była pusta.
Co tu się dzieje ?


Nie sądzę, że bieganie git clone --barezrobi to, co myślisz.
Wolfer

3
Dla mnie ssh: // utworzył folder, zamiast używać zdalnego protokołu. Masz rzeczy do pracy, korzystając z odpowiedzi @ alec-the-geek. Czy mógłbyś wybrać preferowaną odpowiedź na to pytanie - to twoja praca.
akauppi,

1
@akauppi: To jest odpowiedzialność PO, aby rozważyć wszystkie odpowiedzi, ale są one pod żadnym obowiązku zaznaczyć odpowiedź, dopóki nie są spełnione. (Oczywiście nie boli przypomnieć im lub zapytać, jakie dodatkowe informacje są im potrzebne, aby odpowiedź była dla nich możliwa do zaakceptowania!)
jvriesem,

@jvriesem oczywiście. Usunę teraz „to twoja praca”. Ale to stara sprawa ... :)
akauppi,

Odpowiedzi:


219

Jest to prawdopodobnie niezwiązane bezpośrednio z pytaniem; ale jednym błędem, który właśnie popełniłem i widzę w OP, jest specyfikacja adresu URL ssh://user@server:/GitRepos/myproject.git- mianowicie masz zarówno dwukropek :, jak i ukośnik /po nim, oznaczający bezwzględną ścieżkę.

Następnie znalazłem klon Git, ssh: Nie można rozpoznać nazwy hosta - git, programowanie - Nicolas Kuttler (ponieważ taki błąd występował w gitwersji 1.7.9.5), zauważając:

Problem z poleceniem, którego użyłem początkowo, polegał na tym, że próbowałem użyć składni podobnej do scp.

... co też było moim problemem! Więc w zasadzie w gitz ssh, możesz albo użyć

  • ssh://username@host.xz/absolute/path/to/repo.git/ - tylko ukośnik dla absolutnej ścieżki na serwerze
  • username@host.xz:relative/path/to/repo.git/- tylko dwukropek (nie może mieć ssh://ścieżki względnej na serwerze (względem katalogu domowego usernamena komputerze serwera)

Mam nadzieję, że to komuś pomoże,
zdrowie!


84
To nie działa Jeśli chcesz określić ścieżkę względną za pomocą ssh, musisz utracić ssh://prefiks. Właśnie spędziłem 20 minut, próbując to rozgryźć. git clone username@host.xz:relative/path/to/repo.git/powinno działać.
bobbaluba,

2
Wypróbowałem to z git 2.1.4 na Debianie 8. Żadna z sugestii nie działa. Podczas pierwszej próby nie utworzono katalogu w / GitRepos, a przy drugiej próbie narzekał, że ścieżka już istnieje. Tak jak zgłoszono pierwotny problem
dlsa

5
Z powodu twojego komentarza @bbalbaluba (i zaktualizowanej odpowiedzi) nie musiałem też poświęcać na to 20 minut. Dzięki!
olafure

143

W przypadku repozytoriów w serwisie GitHub spróbuj:

git clone ssh://git@github.com/<user>/<repository name>.git

Aby skonfigurować git do klonowania przez ssh, zobacz:


jest <użytkownik> moja nazwa użytkownika w github lub mój adres e-mail dla github? ponieważ ten link sugeruje mi użycie adresu e-mail podczas generowania klucza publicznego. help.github.com/en/github/authenticating-to-github/… po wypróbowaniu tego (puste hasło dla klucza ssh gen), nadal nie mogłem sklonować repozytorium z github. ps Nie dodałem klucza do agenta.
Minnie,

to samo działa również dla gitlab. wcześniej musimy włączyć konfigurację klucza SSH, jak zasugerowałeś
Venkataraman R

45

Musisz uruchomić polecenie klonowania na tym, co nazywasz serwerem. Ale założę się, że nie używasz serwera ssh na lokalnym kliencie, więc i tak to nie zadziała. Zaproponuj skorzystanie z tego podejścia (sprawdź instrukcję, ponieważ robię to z pamięci)

  1. Zaloguj się do serwera.
  2. Utwórz nagie repo za pomocą git init --bare
  3. Na komputerze klienckim możesz przekazać repozytorium na serwer. git remote add origin ssh://user@server:/GitRepos/myproject.gitśledzony przezgit push origin master

Dobra rada! Kilka uwag dla początkujących (takich jak ja), którzy wcześniej nie mieli do czynienia z folderami czystego serwera git: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git przed git init --bare. Nie dostaniesz tutaj kopii roboczej - pliki repozytoriów i foldery (zwykle w .git) będą dla ciebie puste, stąd nazwa flagi. Dzięki
akauppi,

2
„git init --bare” nie tworzy katalogu .git. Umieszcza pliki bezpośrednio w folderze. Podczas dodawania zdalnego źródła dostaję: „” fatal: Nie repozytorium git (ani żadnego rodzica do punktu montowania / home) Zatrzymywanie się na granicy systemu plików (GIT_DISCOVERY_ACROSS_FILESYSTEM nie jest ustawiony).
dlsa

10

Oświadczenie: To tylko kopia komentarza bobbaluba, bardziej widoczna dla przyszłych gości. Pomógł mi bardziej niż jakakolwiek inna odpowiedź.


Musisz ssh://użyć prefiksu, gdy używasz go git clonejako przykładu

git clone git@github.com:owner/repo.git

5

Spróbuj tego.

Krok 1:

ls -al ~/.ssh

wprowadź opis zdjęcia tutaj

Krok 2:

ssh-keygen 

(za pomocą klawisza Enter jako wartości domyślnej) wprowadź opis zdjęcia tutaj Krok 3: Aby skonfigurować plik konfiguracyjny

vim /c/Users/Willie/.ssh/config

Host gitlab.com Nazwa
hosta gitlab.com
Użytkownik git
IdentityFile ~ / .ssh / id_rsa

Krok 4:

git clone git@gitlab.com:<username>/test2.git

wprowadź opis zdjęcia tutaj

Krok 5:
Po zakończeniu kroku 4
1. plik test2.git zostanie pobrany do pobrania 2.
Otrzymasz nowy plik (znane_hosty) w ~ / .ssh
wprowadź opis zdjęcia tutaj

PS: Sam tworzę pliki id_rsa i id_rsa.ub i dostarczam je na serwer Gitlab. używając obu kluczy do dowolnej strony klienta (Windows i Linux).


4

Git 101:

gitto zdecentralizowany system kontroli wersji. Nie potrzebujesz serwera, aby rozpocząć pracę z git. Nadal możesz chcieć to zrobić, ponieważ wygląda fajnie, prawda? (Jest to również przydatne, jeśli chcesz pracować nad jednym projektem z wielu komputerów).

Aby uruchomić „serwer”, musisz go uruchomić, git init --bare <your_project>.gitponieważ utworzy to puste repozytorium, które możesz następnie zaimportować na swoje komputery bez konieczności chowania plików konfiguracyjnych w swoim katalogu .git.

Następnie możesz sklonować repozytorium na swoich klientach, ponieważ powinno to działać, ale odkryłem, że niektórzy klienci (mianowicie git-gui) nie sklonują repozytorium, które jest całkowicie puste. Aby obejść ten problem, musisz biec cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Pamiętaj, że może być konieczne skonfigurowanie nazwy użytkownika i adresu e-mail dla git tego komputera, jeśli nie robiłeś tego w przeszłości. Rzeczywiste polecenia do uruchomienia będą w komunikacie o błędzie, który otrzymasz, więc po prostu je pominę).

W tym momencie można sklonować repozytorium na dowolnej maszynie, po prostu uruchamiając git clone <user>@<server>:<relative_path><your_project>.git. (Jak zauważyli inni, ssh://przed użyciem ścieżki bezwzględnej może być konieczne jej podanie ). Zakłada się, że możesz już zalogować się z klienta na serwer. (Otrzymasz także punkty bonusowe za skonfigurowanie pliku konfiguracyjnego i kluczy ssh, jeśli zamierzasz wypchnąć wiele rzeczy na zdalny serwer).

Kilka istotnych linków:
To w zasadzie mówi ci, co musisz wiedzieć.
I to jest dla tych, którzy znają podstawowe zasady działania git, ale czasami zapominają o dokładnej składni.


Oba te linki wydają się być martwe lub nie pokazują, czego się od nich oczekuje.
Todd

2

Chcę spróbować odpowiedzi, która obejmuje git-flow i trzy „punkty” lub przypadki użycia, centralne repozytorium git, rozwój lokalny i maszynę produkcyjną. To nie jest dobrze przetestowane .

Daję niezwykle konkretne polecenia. Zamiast powiedzieć <your folder>, powiem /root/git. Jedynym miejscem, w którym zmieniam oryginalne polecenie, jest zastąpienie mojej konkretnej nazwy serwera nazwą example.com. Wyjaśnię, że celem folderów jest odpowiednie dostosowanie. Daj mi znać o wszelkich nieporozumieniach, a ja zaktualizuję odpowiedź.

Wersja git na serwerze to 1.7.1. Serwer to CentOS 6.3 (wersja ostateczna).

Wersja git na maszynie programistycznej to 1.8.1.1. To jest Mac OS X 10.8.4.

Centralne repozytorium i maszyna produkcyjna znajdują się na tej samej maszynie.

centralne repozytorium, z którym użytkownicy svn mogą się odnosić jako „serwer”, jest skonfigurowane w następujący sposób. Mam folder, w /root/gitktórym przechowuję wszystkie moje repozytoria git. Chcę utworzyć repozytorium git dla projektu, który nazywam „kwiatami”.

cd /root/git
git clone --bare flowers flowers.git

Polecenie git przekazało dwie wiadomości:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

Nie ma się o co martwić.

Na komputerze programistycznym jest skonfigurowany w następujący sposób. Mam folder, w /home/kinjal/Sitesktórym umieszczam wszystkie moje projekty. Chcę teraz uzyskać centralne repozytorium git.

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

To prowadzi mnie do punktu, w którym mogę zacząć dodawać do niego różne rzeczy. Najpierw skonfigurowałem Git Flow

git flow init -d

Domyślnie jest to gałąź develop. Teraz dodaję mój kod. Następnie muszę zatwierdzić do centralnego repozytorium git.

git add .
git commit -am 'initial'
git push

W tym momencie przeszedł do gałęzi rozwoju. Chcę również dodać to do gałęzi master.

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

Zauważ, że nic nie zrobiłem między początkiem a końcem wydania. A kiedy skończyłem wydawanie, zostałem poproszony o edycję dwóch plików. Doprowadziło to gałąź rozwoju do opanowania.

W witrynie produkcyjnej, która znajduje się na tym samym komputerze, co moje centralne repozytorium git, chcę umieścić repozytorium /var/www/vhosts/example.net. Mam już /var/www/vhosts.

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

Jeśli maszyna produkcyjna byłaby również na innym komputerze, git clonepolecenie wyglądałoby tak, jak na maszynie programistycznej.


1

Z góry trochę brakuje mi umiejętności GIT.

Spowoduje to sklonowanie nagiego repozytorium na twoim komputerze, które zawiera tylko foldery, w .gitktórych znajduje się ukryty katalog. wykonaj ls -ali powinieneś zobaczyć .gitlub cd .gitw swoim repozytorium.

Czy możesz dodać opis swojej intencji, aby osoba z większą liczbą umiejętności GIT mogła pomóc? Czego tak naprawdę chcesz, a czego nie chcesz?


Źle zinterpretowałem polecenie. Stworzyłem drzewo podkatalogów ssh: /myproject.git w bieżącym katalogu. Myślałem, że klonuję do zdalnego katalogu, ale tak naprawdę polecenie to klonuje z repozytorium.
dlsa

0

Zrobiłem: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Wynik: fatal: ścieżka docelowa 'ssh: // luc @ EERSTENASDS119J / volume 1 / RepoA' już istnieje i jest nie pusty katalog.

System utworzył katalog ssh: // luc @ EERSTENASDS119J / volume1 / RepoA w mojej bieżącej ścieżce.

Zatem git clone nie zinterpretował specyfikacji adresu URL. Wykorzystano obejście Aleca.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.