Pada dasarnya saya ingin mengatur repositori di server jauh dengan cepat. Biasanya repositori harus diinisialisasi pada remote dengan init --bare
sebelum seseorang dapat mendorong komit dari perangkat lain. Apakah ada cara untuk menghindari ini?
Idealnya saya memiliki dua poin yang ingin saya penuhi:
- Biarkan sisi klien tidak berubah, artinya tidak ada pengaturan selain
git remote add ...
. - Gunakan SSH sebagai protokol transfer.
Apa yang saya pikirkan sejauh ini:
Mengabaikan permintaan SSH. Dengan mendorong lebih dari HTTPS, saya bisa meng-host server HTTPS yang menginisialisasi repositori yang tidak ada sebelum menerima dorongan.
Mengubah fungsionalitas git di sisi server, membajak perintah push (disebut di shell-git?). Saya tidak menemukan dokumentasi tentang apa yang terjadi di sisi server ketika mendorong SSH jadi saya tidak dapat menyelidiki lebih lanjut solusi yang mungkin ini.
Terkait dengan # 2, saya bisa mengimplementasikan server SSH yang berjalan di remote, menginisialisasi repositori yang tidak ada sebelum menjalankan perintah lebih lanjut. Tetapi seperti dengan # 2, saya tidak menemukan dokumentasi di pipa push.
Klarifikasi:
Bisakah saya mendorong ke remote yang belum menginisialisasi repositori? Bisakah saya cukup mendeteksi dorongan masuk, menginisialisasi repositori sebelum melanjutkan?
svn
bendera?ansible
untuk mengatur repo jarak jauh. Ini tanpa agen, jadi yang Anda butuhkan hanyalah akses SSH ke mesin. Anda bisa menjalankan buku pedoman pada mesin jarak jauh untuk mengatur repo dan kemudian mendorongnya.git init —bare
.Jawaban:
Solusinya akhirnya didasarkan pada # 2:
Saya menemukan artikel oleh "kamalmarhubi" itu menjelaskan apa
git push
sedang melakukan ketika mengatur untuk menggunakan SSH.Solusinya
Atur - sisi server
Tambahkan yang disebut disebut
git
:Perhatikan bahwa pengguna sayangnya tidak dapat menggunakan git-shell karena shell menangani perintah yang diperlukan secara internal.
Buat
.ssh
direktoriBuat
authorized_keys
mengajukanTambahkan kunci publik apa pun yang akan Anda gunakan sebagai garis ke
authorized_keys
mengajukan.Tambahkan yang berikut ini diatas dari pengguna
.bashrc
mengajukan:Pengaturan - sisi klien
Jalankan yang berikut ini di dalam repositori git:
Dimana
server
adalah ip atau nama server dandirectory
path untuk menyimpan repositori di (relatif terhadap direktori home pengguna git, biasanya/home/git/
).Pemakaian
Mendorong kode dari klien
Dorong seperti biasa, layanan telah mengatur inisialisasi repositori untuk Anda!
Bagaimana itu bekerja
Setiap kali Git mendorong SSH, ia memanggil
ssh git@server git-receive-pack directory
, mis. berjalangit-receive-pack directory
pada remote. Saat menggunakan git-shell, perintah ditangani secara internal. Saat menggunakan shell biasa (bash) perintah ditangani seperti perintah bash lainnya. Ini berarti bahwa kita dapat mengganti cara kerja perintah, yang kita lakukan dengan mendefinisikan milik kitagit-receive-pack
di.bashrc
. Definisi harus di bagian atas file sejak itu.bashrc
biasanya membatalkan eksekusi jika dijalankan di shell non-interaktif (seperti Git). Perintah yang kita tentukan pemeriksaan untuk melihat apakah repositori target sudah ada, jika tidak, menginisialisasi itu sebagai repositori kosong (sesuai standar Git) sebelum menjalankan aslinyagit-receive-pack
yang menangani dorongan yang sebenarnya.sumber