ssh aracılığıyla git klonu


233

Git deposu oluşturduğum bir projem var:

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

Başka bir makinede çıplak bir klon oluşturmak istedim:

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

Klonu yürüttüm ama cevap yazmadım. Sunucu makinesinde oturum açtım ve dosyaların nasıl saklandığını görmeye çalıştım. Yol / GitRepos boştu, bu yüzden klonu tekrar yapmaya karar verdim:

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

Bu sefer cevap şuydu:

fatal: hedef yol 'ssh: // user @ server: /GitRepos/myproject.git' zaten var ve boş bir dizin değil.

Ama yolun boş olduğunu gördüm.
Burada neler oluyor ?


Koşmanın yapacağını düşündüğünüzü git clone --bareyapacağını sanmıyorum.
Wolfer

3
Benim için ssh: // uzak bir protokol kullanmak yerine bir klasör oluşturdu. @ Alec-the-geek kullanıcısının yanıtını kullanarak çalışacağınız şeyler var. Bunun için tercih edilen bir cevap seçer misiniz - bu sizin işiniz.
akauppi

1
@akauppi: kadar OP'ın sorumluluğundadır düşünün bütün cevapları, ancak altındadır hayır onlar tatmin dek bir yanıt seçin yükümlülüğü. (Tabii ki, onlara hatırlatmak ya da bir cevap için kabul edilebilir olması için daha fazla bilgi isteyin!)
jvriesem

@jvriesem elbette. Şimdi "bu senin işin" kaldırır. Ama bu eski bir şey ... :)
akauppi

Yanıtlar:


219

Bu muhtemelen doğrudan soru ile ilgisizdir; ancak kendim yaptığım bir hata var ve OP'de görüyorum, URL spesifikasyonu ssh://user@server:/GitRepos/myproject.git- yani, mutlak bir yolu belirttikten sonra hem iki nokta üst üste hem de :eğik çizgi var /.

Daha sonra Git klonunu buldum , ssh: hostname çözülemedi - git, geliştirme - Nicolas Kuttler ( git1.7.9.5 sürümünde aldığım hata buydu), dikkat çeken:

Başlangıçta kullandığım komutla ilgili sorun, scp benzeri bir sözdizimi kullanmaya çalışmamdı.

... bu da benim sorunumdu! Temel gitolarak ssh,

  • ssh://username@host.xz/absolute/path/to/repo.git/ - sunucudaki mutlak yol için sadece eğik çizgi
  • username@host.xz:relative/path/to/repo.git/- yalnızca iki nokta üst üste ( ssh://sunucudaki göreli yol için olmamalıdır ( usernamesunucu makinesindeki ana dizine göre )

Umarım bu birine yardımcı olur,
Şerefe!


84
Bu işe yaramıyor. Ssh ile göreceli bir yol belirtmek istiyorsanız, ssh://öneki kaybetmelisiniz . Bunu anlamaya çalışmak için sadece 20 dakika harcadım. git clone username@host.xz:relative/path/to/repo.git/çalışmalı.
bobbaluba

2
Bir Debian 8 üzerinde git 2.1.4 ile denedim. Her iki öneride çalışmaz. / GitRepos altında ilk denemede hiçbir dizin oluşturulmadı ve 2. denemede yolun zaten var olduğundan şikayet edildi. Tıpkı bildirilen orijinal sorun gibi
dlsa

5
Yorumunuz @bobbaluba (ve güncellenmiş cevap) nedeniyle, bu konuda da 20 dakika harcamak zorunda kalmadım. Teşekkürler!
olafure

143

GitHub'daki depolar için şunu deneyin:

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

Git'i klonla ssh ile ayarlamak için bakınız:


<kullanıcı> kullanıcı adım github'da mı yoksa github için e-posta adresim mi? çünkü bu bağlantı, ortak anahtar oluşturma sırasında e-posta adresini kullanmamı önerir. help.github.com/en/github/authenticating-to-github/… denedikten sonra (ssh key gen için boş parola), yine de github'dan repo'yu klonlayamadım. ps Aracıya anahtar eklemedim.
Minnie

aynı işler gitlab için de. Bundan önce, önerdiğiniz gibi SSH anahtar kurulumunu etkinleştirmemiz gerekiyor
Venkataraman R

45

Sunucuyu aradığınızda klon komutunu çalıştırmanız gerekir. Ama eminim ki yerel istemcinizde bir ssh sunucusu çalıştırmıyorsunuz, bu yüzden yine de çalışmayacak. Bu yaklaşımı izlemenizi öneririz (kılavuzu kontrol edin çünkü bunu bellekten yapıyorum)

  1. Sunucu makinesinde oturum açın.
  2. Kullanarak çıplak bir repo oluşturun git init --bare
  3. İstemci makinede repo'yu sunucuya gönderebilirsiniz. git remote add origin ssh://user@server:/GitRepos/myproject.gitbunu takibengit push origin master

Harika tavsiye! Daha önce saf sunucu-git-klasörleriyle ilgilenmeyen yeni başlayanlar (benim gibi) için bazı notlar: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git git init --bare'den önce. Burada bir çalışma kopyası alamazsınız - repo dosyaları ve klasörleri (normalde .git) sizin için çıplak olur, böylece bayrağın adı. Thanks
akauppi

2
"git init --bare" bir .git dizini oluşturmaz. Dosyaları doğrudan klasöre koyar. Uzak kökeni eklerken şunu elde ederim: "" ölümcül: Git deposu değil (veya bağlama noktasına / eve kadar herhangi bir üst öğe) Dosya sistemi sınırında durdurma (GIT_DISCOVERY_ACROSS_FILESYSTEM ayarlanmadı).
dlsa

10

Feragatname: Bu, bobbaluba'nın gelecekteki ziyaretçiler için daha görünür hale getirdiği bir yorumun sadece bir kopyasıdır . Bana diğer cevaplardan daha çok yardımcı oldu.


Örnek olarak ssh://kullanırken öneki bırakmalısınızgit clone

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

5

bunu dene.

Aşama 1:

ls -al ~/.ssh

resim açıklamasını buraya girin

Adım 2:

ssh-keygen 

(varsayılan değer için enter tuşunu kullanarak) resim açıklamasını buraya girin 3. Adım: Yapılandırma dosyasını ayarlamak için

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

Host gitlab.com
HostName gitlab.com
Kullanıcı git
IdentityFile ~ / .ssh / id_rsa

4. Adım:

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

resim açıklamasını buraya girin

Adım 5:
Adım 4'ü bitirdiğinizde
1. test2.git dosyası indirilecektir
2. ~ / .ssh içindeki yeni dosyayı (bilinen_hosts) alacaksınız
resim açıklamasını buraya girin

Not: id_rsa ve id_rsa.ub'ı kendim oluşturuyorum ve Gitlab sunucusuna teslim ediyorum. her iki anahtarı da herhangi bir istemci tarafı (Windows ve Linux) kullanarak.


4

Git 101:

gitmerkezi olmayan bir sürüm kontrol sistemidir. Git ile çalışmaya başlamak için bir sunucuya ihtiyacınız yoktur. Yine de havalı göründüğü gibi yapmak isteyebilirsiniz, değil mi? (Birden çok bilgisayardan tek bir proje üzerinde çalışmak istiyorsanız da yararlıdır.)

Çalıştırmak için bir "sunucu" çalıştırmak git init --bare <your_project>.gitiçin boş bir depo oluşturacak gibi çalıştırmak gerekir , daha sonra .gitdir makinenizde yapılandırma dosyalarında uğraşmak zorunda kalmadan makinelerinize alabilirsiniz .

Bundan sonra, çalışması gerektiği gibi müşterilerinize repo klonlayabilirsiniz, ancak bazı müşterilerin (yani git-gui) tamamen boş bir repo klonlayamayacağını buldum . Bu sorunu çözmek için koşmanız gerekir cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Daha önce yapmadıysanız, o makinenin git için kullanıcı adınızı ve e-postanızı yapılandırmanız gerekebileceğini unutmayın. Çalıştırılacak gerçek komutlar aldığınız hata mesajında ​​olacaktır, bu yüzden onları atlayacağım.)

Böylece bu noktada depoyu herhangi bir makineye basitçe çalıştırarak klonlayabilirsiniz git clone <user>@<server>:<relative_path><your_project>.git. (Diğerlerinin de işaret ettiği gibi ssh://, mutlak yolu kullanırsanız ön ek yapmanız gerekebilir .) Bu, istemcinizden sunucuya zaten giriş yapabileceğinizi varsayar. ( sshUzak sunucuya çok fazla şey göndermek istiyorsanız, bir yapılandırma dosyası ve anahtarları için bonus puanlar alırsınız .)

İlgili bazı bağlantılar:
Bu, hemen hemen bilmeniz gerekenler hakkında bilgi verir.
Ve bu, git'in temel işleyişini bilen ama bazen tam sözdizimini unutanlar içindir.


Artık bu bağlantıların her ikisi de ölü gibi görünüyor ya da beklediğiniz şeyi göstermiyor.
Todd

2

Git-flow ve üç 'nokta' veya kullanım senaryosu, git merkez deposu, yerel geliştirme ve üretim makinesini içeren bir cevap girişiminde bulunmak istiyorum. Bu iyi test edilmemiştir .

İnanılmaz özel komutlar veriyorum. Söylemek yerine <your folder>söyleyeceğim /root/git. Orijinal komutu değiştirdiğim tek yer, belirli sunucu adımı değiştirmektir example.com. Klasörlerin amacını açıklayacağım, böylece buna göre ayarlayabilirsiniz. Lütfen herhangi bir karışıklık bildirin ve cevabı güncelleyeceğim.

Sunucudaki git sürümü 1.7.1'dir. Sunucu CentOS 6.3'tür (Final).

Geliştirme makinesindeki git sürümü 1.8.1.1'dir. Bu Mac OS X 10.8.4.

Merkezi depo ve üretim makinesi aynı makinede.

svn kullanıcılarının 'sunucu' olarak ilişkilendirilebilecek merkezi depo aşağıdaki gibi yapılandırılır. /root/gitGit depolarımı sakladığım bir klasör var . 'Çiçek' dediğim bir proje için bir git deposu oluşturmak istiyorum.

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

Git komutu iki mesaj verdi:

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

Endişelenecek birşey yok.

Geliştirme makinesinde aşağıdaki gibi yapılandırılır. /home/kinjal/SitesTüm projelerimi koyduğum bir klasörüm var . Şimdi merkezi git deposunu almak istiyorum.

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

Bu beni bir şeyler eklemeye başlayabileceğim bir noktaya götürüyor. İlk önce git akışını ayarladım

git flow init -d

Varsayılan olarak bu daldadır develop. Kodumu buraya ekliyorum, şimdi. O zaman merkezi git deposuna gitmem gerekiyor.

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

Bu noktada gelişme dalına doğru itti. Bunu ana şubeye de eklemek istiyorum.

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

Sürüm başlatma ve sürüm bitiş arasında hiçbir şey yapmadığımı unutmayın. Ve yayınlamayı bitirdiğimde iki dosyayı düzenlemem istendi. Bu, geliştirme dalını ustalaşmaya itti.

Merkezi git depomla aynı makinede olan üretim yerinde, depoyu koymak istiyorum /var/www/vhosts/example.net. Ben zaten var /var/www/vhosts.

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

Üretim makinesi farklı bir makinede de git cloneolsaydı , komut geliştirme makinesinde kullanılana benzeyecektir.


1

Açıkça, GIT becerilerimde biraz eksikim.

Bu, makinenizde yalnızca .gitgizli bir dizin olan klasörleri içeren çıplak bir havuzu klonlayacaktır . yürütmek ls -alve depo içinde .gitveya cd .gitiçinde görmelisiniz .

Daha fazla GIT becerisine sahip birinin yardımcı olabilmesi için niyetinizin bir açıklamasını ekleyebilir misiniz? Bunu nasıl yapmayı planladığınızı gerçekten yapmak istemediğiniz şey nedir?


Komutu yanlış yorumladım. Yaptığım şey şu anki dizin altında ssh: /myproject.git alt dizin ağacı oluşturmaktı. Uzak bir dizine klonladığımı sanıyordum, ama komutun yaptığı şey bir depodan klonlamak.
dlsa

0

Yaptım: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Sonuç: ölümcül: hedef yol 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' zaten var ve boş bir dizin değil.

Sistem geçerli yolumda ssh: // luc @ EERSTENASDS119J / volume1 / RepoA dizini yarattı.

Yani git klonu URL spesifikasyonunu yorumlamadı. Alec'in çözümü kullanıldı.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.