git mengklon melalui ssh


233

Saya punya proyek tempat saya membuat repositori git:

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

Saya ingin membuat klon kosong di komputer lain:

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

Saya mengeksekusi klon tetapi tidak mencetak jawaban. Saya masuk ke mesin server dan mencoba melihat bagaimana file disimpan. Path / GitRepos kosong, jadi saya memutuskan untuk melakukan kloning lagi:

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

Kali ini jawabannya adalah:

fatal: path tujuan 'ssh: // user @ server: /GitRepos/myproject.git' sudah ada dan bukan direktori kosong.

Tetapi saya melihat bahwa jalan itu kosong.
Apa yang terjadi di sini ?


Saya tidak berpikir berlari git clone --bareakan melakukan apa yang menurut Anda akan dilakukan.
Wolfer

3
Bagi saya, ssh: // membuat folder, alih-alih menggunakan protokol jarak jauh. Ada yang bisa digunakan menggunakan jawaban @ alec-the-geek. Maukah Anda memilih jawaban yang disukai untuk ini - itu tugas Anda.
akauppi

1
@akauppi: OP bertanggung jawab untuk mempertimbangkan semua jawaban, tetapi mereka tidak berkewajiban untuk memilih jawaban sampai mereka puas. (Tentu saja, tidak ada salahnya mengingatkan mereka atau menanyakan info lebih lanjut apa yang mereka butuhkan agar jawaban dapat diterima oleh mereka!)
jvriesem

@ jvriesem tentu saja. Akan menghapus "itu tugasmu" sekarang. Tapi ini hal yang lama ... :)
akauppi

Jawaban:


219

Ini mungkin tidak terkait langsung dengan pertanyaan; tetapi satu kesalahan yang baru saja saya buat sendiri, dan saya lihat di OP, adalah spesifikasi URL ssh://user@server:/GitRepos/myproject.git- yaitu, Anda memiliki titik dua :, dan garis miring /setelah itu menandakan jalur absolut.

Saya kemudian menemukan klon Git, ssh: Tidak dapat menyelesaikan nama host - git, pengembangan - Nicolas Kuttler (karena itu adalah kesalahan yang saya dapatkan, pada gitversi 1.7.9.5), mencatat:

Masalah dengan perintah yang saya gunakan pada awalnya adalah bahwa saya mencoba menggunakan sintaksis scp-like.

... yang juga masalah saya! Jadi pada dasarnya gitdengan ssh, Anda juga menggunakan

  • ssh://username@host.xz/absolute/path/to/repo.git/ - hanya garis miring untuk jalur absolut di server
  • username@host.xz:relative/path/to/repo.git/- hanya titik dua (tidak harus memiliki ssh://path relatif pada server (relatif terhadap dir home usernamepada mesin server)

Semoga ini bisa membantu seseorang,
Ceria!


84
Ini tidak berfungsi. Jika Anda ingin menentukan jalur relatif dengan ssh, Anda harus kehilangan ssh://awalan. Saya hanya menghabiskan 20 menit untuk mencari tahu ini. git clone username@host.xz:relative/path/to/repo.git/harus bekerja.
bobbaluba

2
Mencoba dengan git 2.1.4 pada Debian 8. Entah saran tidak berfungsi. Tidak ada direktori yang dibuat di bawah / GitRepos pada percobaan pertama, dan pada percobaan kedua mengeluh bahwa path sudah ada. Persis seperti yang dilaporkan masalah aslinya
dlsa

5
Karena komentar Anda @bobbaluba (dan jawaban yang diperbarui), saya tidak perlu menghabiskan 20 menit untuk ini juga. Terima kasih!
olafure

143

Untuk repositori di GitHub, coba:

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

Untuk mengatur git untuk mengkloning melalui ssh, lihat:


apakah <user> nama pengguna saya di github atau alamat email saya untuk github? karena tautan ini menyarankan saya untuk menggunakan alamat email selama pembuatan kunci publik. help.github.com/en/github/authenticating-to-github/... setelah mencoba itu (kata sandi kosong untuk gen kunci ssh), saya masih tidak dapat mengkloning repo dari github. ps saya tidak menambahkan kunci ke agen.
Minnie

karya yang sama untuk gitlab juga. sebelum itu, kita perlu mengaktifkan pengaturan kunci SSH, seperti yang Anda sarankan
Venkataraman R

45

Anda perlu menjalankan perintah klon pada apa yang Anda panggil server. Tapi saya yakin Anda tidak menjalankan ssh server pada klien lokal Anda sehingga tidak akan berhasil. Sarankan Anda mengikuti pendekatan ini (periksa manual karena saya melakukan ini dari memori)

  1. Masuk ke mesin server.
  2. Buat repo kosong menggunakan git init --bare
  3. Pada mesin klien Anda dapat mendorong repo Anda ke server. git remote add origin ssh://user@server:/GitRepos/myproject.gitdiikuti olehgit push origin master

Saran bagus! Beberapa catatan untuk pendatang baru (seperti saya) yang belum pernah menangani murni-server-git-folder sebelumnya: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git sebelum git init --bare. Anda tidak akan mendapatkan copy pekerjaan di sini - file dan folder repo (biasanya dalam .git) akan kosong untuk Anda, dengan demikian nama bendera. Terima kasih
alias

2
"git init --bare" tidak membuat direktori .git. Ini menempatkan file langsung di folder. Ketika menambahkan asal remote saya mendapatkan: "" fatal: Bukan repositori git (atau orang tua mana pun hingga titik mount / home) Menghentikan batas filesystem (GIT_DISCOVERY_ACROSS_FILESYSTEM tidak disetel).
dlsa

10

Penafian: Ini hanya salinan komentar oleh bobbaluba yang dibuat lebih terlihat oleh pengunjung masa depan. Itu membantu saya lebih dari jawaban lain.


Anda harus membuang ssh://awalan saat menggunakan git clonesebagai contoh

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

5

coba ini.

Langkah 1:

ls -al ~/.ssh

masukkan deskripsi gambar di sini

Langkah 2:

ssh-keygen 

(menggunakan tombol enter untuk nilai default) masukkan deskripsi gambar di sini Langkah 3: Untuk mengatur file konfigurasi

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

Host gitlab.com HostName
gitlab.com
Pengguna git
IdentityFile ~ / .ssh / id_rsa

Langkah 4:

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

masukkan deskripsi gambar di sini

Langkah 5:
Ketika Anda selesai Langkah 4
1. file test2.git akan diunduh selesai
2. Anda akan mendapatkan file baru (known_hosts) di ~ / .ssh
masukkan deskripsi gambar di sini

PS: Saya membuat id_rsa dan id_rsa.ub oleh meself dan saya mengirimkannya ke server Gitlab. menggunakan kedua kunci untuk sisi klien (windows dan Linux).


4

Git 101:

gitadalah sistem kontrol versi desentralisasi. Anda tidak perlu memerlukan server untuk bangkit dan berjalan dengan git. Masih mungkin Anda ingin melakukan itu karena terlihat keren, bukan? (Ini juga berguna jika Anda ingin bekerja pada satu proyek dari beberapa komputer.)

Jadi untuk menjalankan "server" Anda harus menjalankannya git init --bare <your_project>.gitkarena ini akan membuat repositori kosong, yang kemudian dapat Anda impor pada mesin Anda tanpa harus menyelinap di file konfigurasi dalam .gitdirektori Anda .

Setelah ini, Anda dapat mengkloning repo pada klien Anda seperti yang seharusnya berfungsi, tetapi saya menemukan bahwa beberapa klien (yaitu git-gui) akan gagal untuk mengkloning repo yang benar-benar kosong. Untuk mengatasi ini, Anda perlu menjalankan cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Perhatikan bahwa Anda mungkin perlu mengonfigurasi nama pengguna dan email untuk git mesin itu jika Anda belum melakukannya di masa lalu. Perintah yang sebenarnya untuk dijalankan akan ada dalam pesan kesalahan yang Anda dapatkan sehingga saya akan menghilangkannya.)

Jadi pada titik ini Anda dapat mengkloning repositori ke mesin apa pun hanya dengan menjalankan git clone <user>@<server>:<relative_path><your_project>.git. (Seperti yang telah ditunjukkan oleh orang lain, Anda mungkin perlu mengawali dengan ssh://jika Anda menggunakan jalur absolut.) Ini mengasumsikan bahwa Anda sudah bisa masuk dari klien Anda ke server. (Anda juga akan mendapatkan poin bonus untuk menyiapkan file konfigurasi dan kunci untuk ssh, jika Anda bermaksud mendorong banyak hal ke server jarak jauh.)

Beberapa tautan yang relevan:
Ini cukup banyak memberi tahu Anda apa yang perlu Anda ketahui.
Dan ini untuk mereka yang tahu cara kerja dasar git tapi kadang-kadang lupa sintaks yang tepat.


Kedua tautan sekarang tampaknya sudah mati atau tidak menunjukkan apa yang Anda harapkan.
Todd

2

Saya ingin mencoba jawaban yang mencakup git-flow, dan tiga 'poin' atau kasus penggunaan, git central repository, pengembangan lokal dan mesin produksi. Ini tidak diuji dengan baik .

Saya memberikan perintah yang sangat spesifik. Alih-alih mengatakan <your folder>, saya akan mengatakan /root/git. Satu-satunya tempat saya mengubah perintah asli adalah mengganti nama server spesifik saya dengan example.com. Saya akan menjelaskan tujuan folder agar Anda dapat menyesuaikannya. Tolong beri tahu saya jika ada kebingungan dan saya akan memperbarui jawabannya.

Versi git di server adalah 1.7.1. Servernya adalah CentOS 6.3 (Final).

Versi git pada mesin pengembangan adalah 1.8.1.1. Ini adalah Mac OS X 10.8.4.

Repositori pusat dan mesin produksi berada di mesin yang sama.

repositori pusat, dimana svn yang dapat dihubungkan pengguna sebagai 'server' dikonfigurasi sebagai berikut. Saya memiliki folder /root/gittempat saya menyimpan semua repositori git saya. Saya ingin membuat repositori git untuk proyek yang saya sebut 'bunga'.

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

Perintah git memberikan dua pesan:

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

Tidak ada yang perlu dikhawatirkan.

Pada mesin pengembangan dikonfigurasi sebagai berikut. Saya memiliki folder /home/kinjal/Sitestempat saya meletakkan semua proyek saya. Sekarang saya ingin mendapatkan repositori central git.

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

Ini membuat saya sampai pada titik di mana saya bisa mulai menambahkan barang ke sana. Saya pertama kali mengatur aliran git

git flow init -d

Secara default ini ada di cabang develop. Saya menambahkan kode saya di sini, sekarang. Maka saya perlu komit ke repositori central git.

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

Pada titik ini mendorong ke cabang mengembangkan. Saya ingin juga menambahkan ini ke cabang master.

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

Perhatikan bahwa saya tidak melakukan apa pun di antara mulai rilis dan selesai rilis. Dan ketika saya selesai menyelesaikan rilis saya diminta untuk mengedit dua file. Ini mendorong cabang pengembangan untuk dikuasai.

Di situs produksi, yang berada di mesin yang sama dengan repositori central git saya, saya ingin memasukkan repositori ke dalamnya /var/www/vhosts/example.net. Saya sudah punya /var/www/vhosts.

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

Jika mesin produksi juga berada pada mesin yang berbeda, git cloneperintahnya akan terlihat seperti yang digunakan pada mesin pengembangan.


1

Di muka, saya sedikit kurang dalam keterampilan GIT saya.

Itu akan mengkloning repositori kosong pada mesin Anda, yang hanya berisi folder di dalamnya .gityang merupakan direktori tersembunyi. jalankan ls -aldan Anda akan melihat .gitatau cd .gitdi dalam repositori Anda.

Bisakah Anda menambahkan deskripsi niat Anda sehingga seseorang dengan keterampilan GIT yang lebih banyak dapat membantu? Apa yang sebenarnya Anda ingin lakukan, bukan bagaimana Anda berencana melakukannya?


Saya salah menafsirkan perintah. Apa yang saya lakukan adalah membuat pohon subdirektori ssh: /myproject.git di bawah direktori saat ini. Saya pikir saya sedang kloning ke direktori jauh, tetapi apa yang benar-benar dilakukan perintah adalah klon dari repositori.
dlsa

0

Saya lakukan: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Hasil: fatal: path tujuan 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' sudah ada dan sudah bukan direktori kosong.

Sistem membuat direktori ssh: // luc @ EERSTENASDS119J / volume1 / RepoA di jalur saya saat ini.

Jadi klon git tidak menafsirkan spesifikasi URL. Menggunakan solusi dari Alec.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.