Jawaban:
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 pull
dari repositori jarak jauh.
git push origin master
gagal dengan kesalahan "repositori tidak ditemukan", coba git update-server-info
di sisi jarak jauh, di mana Anda melakukannyagit init --bare
git update-server-info
tetapi saya mendapatkan kesalahan fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
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 --bare
opsi. 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.com
memiliki akses SSH, dan Anda ingin menyimpan semua repositori Git Anda di bawah /opt/git
direktori. Anda dapat mengatur repositori baru Anda dengan menyalin repositori kosong Anda ke:
$ scp -r my_project.git user@git.example.com:/opt/git
Pada titik ini, pengguna lain yang memiliki akses SSH ke server yang sama yang memiliki akses baca ke /opt/git
direktori dapat mengkloning repositori Anda dengan menjalankan
$ git clone user@git.example.com:/opt/git/my_project.git
Jika SSH pengguna masuk ke server dan memiliki akses tulis ke /opt/git/my_project.git
direktori, 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 --shared
opsi.
$ ssh user@git.example.com
$ 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.
scp
solusi 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.
--shared
berhasil untuk saya. Saya ingin tahu apa yang terjadi jika Anda menggunakannya git init --shared
tanpa membuat --bare
...
scp
agar 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.
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).
Ada perbedaan menarik antara dua solusi populer di atas:
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.
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.
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
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
Biasanya Anda dapat mengatur git repo dengan hanya menggunakan init
perintah
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 clone
perintah:
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.