Bagaimana cara membuat repositori Git jarak jauh dari yang lokal?

243

Saya memiliki repositori Git lokal. Saya ingin membuatnya tersedia di server jarak jauh, ssh-enabled. Bagaimana saya melakukan ini?

Nips
sumber

Jawaban:

288

Saya pikir Anda membuat repositori telanjang di sisi remote git init --bare,, tambahkan sisi remote sebagai pelacak push / pull untuk repositori lokal Anda ( git remote add origin URL), dan kemudian secara lokal Anda hanya mengatakan git push origin master. Sekarang repositori lain dapat pulldari repositori jarak jauh.

Kerrek SB
sumber
@Nips: ya, benar, maaf. Anda mendorong cabang individu, memang!
Kerrek SB
Bagaimana jika saya menggunakan GUI? Bagaimana saya bisa mengatur server untuk semua repositori dan setiap PC di jaringan yang sama terhubung ke itu?
SearchForKnowledge
4
jika git push origin mastergagal dengan kesalahan "repositori tidak ditemukan", coba git update-server-infodi sisi jarak jauh, di mana Anda melakukannyagit init --bare
HongKilDong
7
@KerrekSB apakah mungkin untuk secara otomatis membuat repo kosong di server segera setelah saya menjalankan git push origin master di lokal saya
ANinJa
@HongKilDong Saya mencoba git update-server-infotetapi saya mendapatkan kesalahan fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
Nayef
81

Untuk awalnya mengatur server Git, Anda harus mengekspor repositori yang ada ke repositori telanjang baru - repositori yang tidak berisi direktori yang berfungsi. Ini umumnya mudah dilakukan. Untuk mengkloning repositori Anda untuk membuat repositori kosong yang baru, Anda menjalankan perintah clone dengan --bareopsi. Dengan konvensi, direktori repositori kosong berakhir .git, seperti:

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

Perintah ini mengambil repositori Git dengan sendirinya, tanpa direktori yang berfungsi, dan membuat direktori khusus untuk itu saja.

Sekarang Anda memiliki salinan repositori Anda, yang perlu Anda lakukan adalah meletakkannya di server dan mengatur protokol Anda. Katakanlah Anda telah membuat server yang disebut git.example.commemiliki akses SSH, dan Anda ingin menyimpan semua repositori Git Anda di bawah /opt/gitdirektori. Anda dapat mengatur repositori baru Anda dengan menyalin repositori kosong Anda ke:

$ scp -r my_project.git [email protected]:/opt/git

Pada titik ini, pengguna lain yang memiliki akses SSH ke server yang sama yang memiliki akses baca ke /opt/gitdirektori dapat mengkloning repositori Anda dengan menjalankan

$ git clone [email protected]:/opt/git/my_project.git

Jika SSH pengguna masuk ke server dan memiliki akses tulis ke /opt/git/my_project.gitdirektori, mereka juga akan secara otomatis memiliki akses push. Git akan secara otomatis menambahkan izin menulis grup ke repositori dengan benar jika Anda menjalankan perintah git init dengan --sharedopsi.

$ ssh [email protected]
$ cd /opt/git/my_project.git
$ git init --bare --shared

Sangat mudah untuk mengambil repositori Git, membuat versi telanjang, dan meletakkannya di server di mana Anda dan kolaborator Anda memiliki akses SSH. Sekarang Anda siap berkolaborasi pada proyek yang sama.

Binoy Babu
sumber
6
The scpsolusi bekerja IMO lebih baik dalam praktek daripada init --bare. Masih terasa seperti peretasan yang jelek, meskipun untuk pertama-tama mengkloning secara lokal, kemudian menyalin ke server ... berharap git memiliki perintah untuk melakukannya dalam sekali jalan.
leftaroundabout
1
Memberi ini +1 karena --sharedberhasil untuk saya. Saya ingin tahu apa yang terjadi jika Anda menggunakannya git init --sharedtanpa membuat --bare...
icedwater
1
Buat repositori telanjang secara lokal dan scpagar sebuah remote berfungsi lebih baik jika remote tidak mendukung git init --bare(seperti halnya saya dengan git 1.5.5, 2008). Saya pikir ini harus bekerja bahkan jika remote tidak memiliki git sama sekali.
Yaroslav Nikitenko
1
Referensi: git-scm.com/book/en/v1/…
berbt
1
sebuah catatan minor: langkah scp dari solusi sudah benar tetapi ia bekerja jika pengguna jarak jauh memiliki shell biasa, jika pengguna menggunakan git-shell itu tidak akan berfungsi.
user1708042
9

Catatan untuk orang-orang yang membuat salinan lokal pada Windows dan ingin membuat repositori jarak jauh yang sesuai pada sistem Unix-line, di mana file teks mendapatkan akhiran LF pada klon lebih lanjut oleh pengembang pada sistem mirip Unix, tetapi CRLF berakhir pada Windows.

Jika Anda membuat repositori Windows Anda sebelum mengatur terjemahan akhir baris maka Anda memiliki masalah. Pengaturan default Git adalah tanpa terjemahan, jadi set kerja Anda menggunakan CRLF tetapi repositori Anda (yaitu data yang disimpan dalam .git) telah menyimpan file-file tersebut sebagai CRLF juga.

Ketika Anda mendorong ke remote, file yang disimpan disalin apa adanya, tidak ada terjemahan akhir baris yang terjadi. (Terjemahan akhir baris terjadi ketika file dikomit ke repositori, bukan ketika repositori didorong). Anda berakhir dengan CRLF di repositori seperti Unix, yang bukan yang Anda inginkan.

Untuk mendapatkan LF di repositori jarak jauh Anda harus memastikan LF berada di repositori lokal terlebih dahulu, dengan menormalkan kembali repositori Windows Anda . Ini tidak akan memiliki efek yang terlihat pada perangkat Windows Anda, yang masih memiliki ujung CRLF, namun ketika Anda mendorong ke remote, remote akan mendapatkan LF dengan benar.

Saya tidak yakin apakah ada cara mudah untuk mengetahui akhiran baris apa yang Anda miliki di repositori Windows Anda - saya kira Anda bisa mengujinya dengan menetapkan core.autocrlf = false dan kemudian kloning (Jika repo memiliki akhiran LF, klon akan memiliki LF juga).

pengguna1804620
sumber
5

Ada perbedaan menarik antara dua solusi populer di atas:

  1. Jika Anda membuat repositori kosong seperti ini:

    cd / outside_of_any_repo
    mkdir my_remote.git
    cd my_remote.git
    git init --bare
    

lalu

cd  /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master

Kemudian git mengatur konfigurasi di 'original_repo' dengan hubungan ini:

original_repo origin --> /outside_of_any_repo/my_remote.git/

dengan yang terakhir sebagai remote hulu. Dan remote upstream tidak memiliki remote lain dalam konfigurasinya.

  1. Namun, jika Anda melakukannya sebaliknya:

    (dari dalam direktori original_repo)
    cd ..
    git clone --bas original_repo /outside_of_any_repo/my_remote.git
    

kemudian 'my_remote.git' berakhir dengan konfigurasinya dengan 'asal' menunjuk kembali ke 'original_repo' sebagai remote, dengan remote.origin.url menyamakan dengan jalur direktori lokal, yang mungkin tidak sesuai jika akan dipindahkan ke server.

Walaupun referensi "jarak jauh" itu mudah dihilangkan nanti jika tidak sesuai, 'original_repo' masih harus diatur untuk menunjuk ke 'my_remote.git' sebagai remote up-stream (atau ke mana pun ia pergi untuk dibagikan dari). Jadi secara teknis, Anda bisa sampai pada hasil yang sama dengan beberapa langkah lagi dengan pendekatan # 2. Tapi # 1 tampaknya pendekatan yang lebih langsung untuk menciptakan "repo sentral telanjang bersama" yang berasal dari yang lokal, yang sesuai untuk pindah ke server, dengan lebih sedikit langkah yang terlibat. Saya pikir itu tergantung pada peran yang Anda inginkan repo jarak jauh untuk dimainkan. (Dan ya, ini bertentangan dengan dokumentasi di sini .)

Peringatan: Saya mempelajari hal di atas (pada tulisan ini pada awal Agustus 2019) dengan melakukan tes pada sistem lokal saya dengan repo nyata, dan kemudian melakukan perbandingan file-per-file antara hasilnya. Tapi! Saya masih belajar, jadi mungkin ada cara yang lebih benar. Tetapi tes saya telah membantu saya menyimpulkan bahwa # 1 adalah metode yang saya sukai saat ini.

V. Wheeler
sumber
4

Repositori jarak jauh umumnya adalah repositori kosong - repositori Git yang tidak memiliki direktori yang berfungsi. Karena repositori hanya digunakan sebagai titik kolaborasi, tidak ada alasan untuk memeriksa snapshot pada disk; itu hanya data Git. Dalam istilah yang paling sederhana, repositori kosong adalah isi dari direktori .git proyek Anda dan tidak ada yang lain.

Anda dapat membuat repositori bare git dengan kode berikut:

$ git clone --bare /path/to/project project.git

Salah satu opsi untuk memiliki repositori git jarak jauh adalah menggunakan protokol SSH:

Protokol transport yang umum untuk Git ketika hosting sendiri di atas SSH. Ini karena akses SSH ke server sudah diatur di sebagian besar tempat - dan jika tidak, itu mudah dilakukan. SSH juga merupakan protokol jaringan yang diautentikasi dan, karena ada di mana-mana, umumnya mudah diatur dan digunakan.

Untuk mengkloning repositori Git melalui SSH, Anda dapat menentukan ssh://URL seperti ini:

$ git clone ssh://[user@]server/project.git

Atau Anda dapat menggunakan sintaks seperti scp pendek untuk protokol SSH:

$ git clone [user@]server:project.git

Dalam kedua kasus di atas, jika Anda tidak menentukan nama pengguna opsional, Git menganggap pengguna yang Anda masuki saat ini.

Pro

Pro menggunakan SSH banyak. Pertama, SSH relatif mudah diatur - daemon SSH adalah hal biasa, banyak admin jaringan yang berpengalaman dengan mereka, dan banyak distribusi OS diatur dengan mereka atau memiliki alat untuk mengelolanya. Selanjutnya, akses melalui SSH aman - semua transfer data dienkripsi dan diautentikasi. Terakhir, seperti protokol HTTPS, Git dan Lokal, SSH efisien, membuat data sekompleks mungkin sebelum mentransfernya.

The Cons

Aspek negatif SSH adalah tidak mendukung akses anonim ke repositori Git Anda. Jika Anda menggunakan SSH, orang-orang harus memiliki akses SSH ke mesin Anda, bahkan dalam kapasitas read-only, yang tidak membuat SSH kondusif untuk proyek open source yang orang mungkin hanya ingin mengkloning repositori Anda untuk memeriksanya. Jika Anda menggunakannya hanya di dalam jaringan perusahaan Anda, SSH mungkin satu-satunya protokol yang perlu Anda tangani. Jika Anda ingin mengizinkan akses hanya baca anonim ke proyek Anda dan juga ingin menggunakan SSH, Anda harus menyiapkan SSH agar Anda dorong tetapi ada hal lain yang dapat diambil orang lain.

Untuk informasi lebih lanjut, periksa referensi: Git di Server - Protokol

Amirhossein72
sumber
3

Anda perlu membuat direktori di server jauh. Kemudian gunakan perintah "git init" untuk mengaturnya sebagai repositori. Ini harus dilakukan untuk setiap proyek baru yang Anda miliki (setiap folder baru)

Dengan asumsi Anda telah mensetup dan menggunakan git menggunakan kunci ssh, saya menulis skrip Python kecil, yang ketika dijalankan dari direktori yang berfungsi akan mengatur sebuah remote dan menginisialisasi direktori sebagai git repo. Tentu saja, Anda harus mengedit skrip (hanya sekali) untuk memberi tahu server dan jalur Root untuk semua repositori.

Periksa di sini - https://github.com/skbobade/ocgi

Sam
sumber
-3

Biasanya Anda dapat mengatur git repo dengan hanya menggunakan initperintah

git init

Dalam kasus Anda, sudah ada repo pada remote yang tersedia. Bergantung pada bagaimana Anda mengakses repo jarak jauh Anda (dengan nama pengguna di dalam url atau kunci ssh yang menangani verifikasi) gunakan hanya cloneperintah:

git clone git@[my.url.com]:[git-repo-name].git

Ada juga cara lain untuk mengkloning repo. Dengan cara ini Anda menyebutnya jika Anda memiliki pengaturan kunci ssh pada mesin Anda yang memverifikasi saat menarik repositori Anda. Ada kombinasi lain dari url jika Anda ingin memasukkan kata sandi dan nama pengguna di dalam untuk masuk ke repositori jarak jauh Anda.

Alex Cio
sumber
1
betapa ironisnya ini .... seseorang baru saja menurunkan jawaban ini hari ini, dan sekarang saya berjuang untuk mendorong file saya. Sepertinya saya perlu latihan git untuk masuk lagi!
Alex Cio
7
Saya pikir masalahnya adalah OP menginginkan solusi untuk membuat repo jarak jauh pada server ssh, tetapi Anda menjelaskan cara membuat repo lokal dari server ssh jarak jauh. Anda tidak menjawab pertanyaan itu. (Bukan saya yang turun.)
peterh - Reinstate Monica