Git mendorong ke repositori baru di remote, menginisialisasi dengan cepat

0

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:

  1. Biarkan sisi klien tidak berubah, artinya tidak ada pengaturan selain git remote add ....
  2. Gunakan SSH sebagai protokol transfer.

Apa yang saya pikirkan sejauh ini:

  1. Mengabaikan permintaan SSH. Dengan mendorong lebih dari HTTPS, saya bisa meng-host server HTTPS yang menginisialisasi repositori yang tidak ada sebelum menerima dorongan.

  2. 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.

  3. 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?

Alex
sumber
Mengapa svn bendera?
uzsolt
Itu kesalahan saya, terima kasih @uzsolt
Alex
Mungkin Anda bisa menggunakan manajemen konfigurasi seperti 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.
duenni
@duenni Itu adalah solusi, tetapi tujuannya adalah untuk tidak menggunakan interaksi pengguna selain mendorongnya sebagai asal seolah-olah sudah diatur menggunakan git init —bare.
Alex

Jawaban:

0

Solusinya akhirnya didasarkan pada # 2:

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.

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:

sudo useradd -m git

Perhatikan bahwa pengguna sayangnya tidak dapat menggunakan git-shell karena shell menangani perintah yang diperlukan secara internal.

Buat .ssh direktori

mkdir .ssh

Buat authorized_keys mengajukan

touch .ssh/authorized_keys

Tambahkan kunci publik apa pun yang akan Anda gunakan sebagai garis ke authorized_keys mengajukan.

Tambahkan yang berikut ini diatas dari pengguna .bashrc mengajukan:

function git-receive-pack() {
  if [ ! -d $1 ]; then
    mkdir -p $1 && cd $1 && git init --quiet --bare && command git-receive-pack $@
  fi
}

Pengaturan - sisi klien

Jalankan yang berikut ini di dalam repositori git:

git add remote origin git@server:directory

Dimana server adalah ip atau nama server dan directory 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. berjalan git-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 kita git-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 aslinya git-receive-pack yang menangani dorongan yang sebenarnya.

Alex
sumber