Menyimpan repositori git pada host yang berbeda dalam sinkronisasi

34

Saya berpikir untuk memulai proyek kecil dan saya ingin membuat versinya dengan git.

Bitbucket sepertinya pilihan yang bagus untukku dengan paket gratisan mereka. Saya ingin menggunakannya sebagai alat utama untuk bekerja dengan git karena mereka memiliki alat yang bagus seperti antarmuka web, klien Mac OS, dan sebagainya. Tetapi, untuk mendapatkan perlindungan yang lebih tinggi dari kerusakan yang tidak disengaja yang dapat disebabkan oleh penggunaan layanan pihak ketiga, saya juga ingin menginstal git pada NAS saya sebagai salinan cadangan kedua dari repositori.

Sekarang pertanyaan saya adalah, apakah mungkin untuk membuat repositori pada dua host yang berbeda dan kemudian tetap menyinkronkannya? Sebagai contoh, misalkan sekali seminggu saya memperbarui repositori di NAS saya agar sesuai dengan yang ada di Bitbucket. Kemudian, seandainya terjadi sesuatu dengan Bitbucket, saya masih akan memiliki repositori penuh dengan sejarah penuh pengembangan pada penyimpanan NAS lokal saya.

Dan adakah cara untuk mengimpor repositori yang sudah ada dengan riwayat lengkap ke layanan git lain?


Saya pikir mirroring adalah yang saya butuhkan. Artikel ini sepertinya menggambarkan dengan tepat apa yang saya butuhkan. Dan ini salah satu juga.

Saya percaya bahwa itu akan membuat salinan lengkap dengan riwayat lengkap dan bahkan secara otomatis mengkomit versi baru ke repositori pada kedua host secara otomatis.

Apakah saya benar?

BartoNaz
sumber
saya menggunakan xpdev saya bertanya-tanya dalam situasi sistem 2 Anda apa manfaatnya tipu muslihat git dalam kasus Anda. hanya untuk memastikan dari setiap build akhir saya membuat cadangan usb. Tapi pada dasarnya versi ditangani oleh xpdev jadi bukan persyaratan nyata. BTW jika Anda memiliki bukti bodoh NASS Raid1 atau lebih, Anda mungkin mempertimbangkan untuk menjalankan sistem versi Anda sendiri ada juga beberapa freeones
user613326
Tetapi saya ingin memiliki versi lengkap tersedia di 2 tempat. Jika hosting pihak ketiga meninggal, atau perusahaan, menjalankannya, hilang begitu saja, saya ingin memiliki pengalaman yang sama persis dengan semua riwayat versi ...
BartoNaz
Itu berarti bahwa saya akan memiliki Bitbucket untuk kenyamanan dan git di NAS untuk keamanan 99,9%.
BartoNaz
Sedangkan untuk xp-dev perusahaan yang tidak seperti itu mati, mereka mungkin mengubah kode hosting paket, harga, dll. Atau bergabung dengan perusahaan lain. Tapi itu adalah susu sapi bagi mereka. Dan mereka juga akan membuat cadangan data yang berharga. Ini bisnis mereka untuk tetap di tempat. Saya menggunakannya dengan 3 pengembang, dan kode kami ada di 5 mesin yang berbeda, di mana selalu ada salinan sumber lokal yang disinkronkan di xp dev. XP dev gratis jika Anda hanya memiliki beberapa proyek.
user613326
1
Tentu saja, itu tidak mungkin. Tapi tetap saja, Anda tidak akan pernah bisa 100% yakin ...
BartoNaz

Jawaban:

19

Ya, itulah keindahan DVCS seperti git. Anda dapat menggunakan sejumlah repo yang berbeda dengan status yang sama dengan yang ada di bitbucket atau github.

Bahkan Anda salinan lokal (repositori di komputer Anda) biasanya merupakan tiruan penuh dari repo jarak jauh.

Satu-satunya hal yang harus Anda lakukan untuk menjaga beberapa repo tetap sinkron adalah menariknya untuk satu (biasanya disebut asal atau hulu) dan mendorong ke salinan cadangan.

Wilbert
sumber
11
Sayangnya semua tidak begitu mengkilap. Lihat peringatan yang diambil dari KDE dekat-bencana . Artinya, pastikan cadangan tidak menghapus hal-hal (cabang, repositori, dll.) Yang dihapus pada server yang didukung.
Jan Hudec
Saya masih tidak yakin apakah saya memahaminya dengan benar. Sejauh yang saya mengerti, mendorong dan menarik karya dengan versi tertentu. Tetapi katakanlah saya memiliki versi terbaru dari kode di mesin saya. Saya memiliki repositori git pada host jarak jauh (Bitbucket, Github, atau apa pun), yang memiliki sejarah penuh pengembangan kode hingga versi terbaru yang saya miliki di mesin yang bekerja (jika itu dilakukan). Dan saya memiliki repositori di NAS yang kosong. Bisakah saya mengimpor sejarah penuh kode dari host jarak jauh ke NAS saya sehingga saya memiliki dua repositori identik di dua tempat, dan bagaimana caranya?
BartoNaz
2
Kloning repositori jarak jauh, lalu tarik semua pembaruan (semua cabang) ke sana secara berkala. Klon git berisi sejarah, tidak seperti checkout svn yang hanya memiliki versi terbaru.
Wilbert
11

Inilah solusi teruji untuk masalah ini: Sinkronisasi Otomatis 2 Repositori Remote Git

Sebuah skrip sederhana untuk menyinkronkan 2 repositori Git jarak jauh

Saya telah mencari di web untuk skrip sederhana yang akan disinkronkan. 2 repositori jarak jauh tetapi saya tidak dapat menemukan skrip seperti itu walaupun banyak yang tampaknya mencarinya! Jadi saya telah membuat 2 repositori tes sederhana dan mulai menguji dan membangun skrip tersebut.

Apa yang harus dilakukan skrip seperti itu?

Secara umum, langkah-langkah untuk melakukannya sederhana: 1. Mengkloning repositori pertama 1. Tambahkan yang kedua sebagai repositori jarak jauh tambahan 1. ambil semua yang ada di repositori kedua 1. dorong repositori lokal yang diperbarui ke dalam 2 repositori jarak jauh.

Masalah yang tersisa adalah - apakah sakelar yang benar untuk semua perintah git di atas?

Jadi begini...

Skrip gisp 2repos-sync.sh

# Clear the folder first - please use this carefully
rm -rf $REPO_NAME  
# clone the reposotory
git clone --bare $ORIGIN_URL

# add a remote repository
cd $REPO_NAME
git remote add --mirror=fetch repo1 $REPO1_URL

# update the local copy from the first repository
git fetch origin --tags

# update the local copy with the second repository
git fetch repo1 --tags

# sync back the 2 repositories
git push origin --all
git push origin --tags
git push repo1 --all
git push repo1 --tags

CATATAN - skrip ini tidak menyelesaikan kasus konflik antara konten repositori!

yorammi
sumber
Anda mungkin ingin menyebutkan dalam jawaban Anda bahwa hal pertama yang Anda lakukan adalah menghapus direktori lokal yang ada dengan $ REPO_NAME. Ini tampaknya penting dan mungkin mencegah kehilangan data bagi orang yang hanya menyalin solusi Anda.
Wilbert
Untuk mengikuti ini, LibGit2 berguna untuk hal semacam ini.
RubberDuck
0

Saya menggunakan GitLab pribadi untuk menyimpan semua repositori saya, jadi saya hanya memiliki satu sumber yang saya dorong dan tarik ketika saya melakukan pengembangan sehari-hari.

Tetapi, untuk proyek open source, GitHub adalah komunitas yang jauh lebih bersemangat, jadi, jika saya ingin menerima kontribusi komunitas untuk proyek saya, saya menggunakan sistem web hook GitLab untuk melakukan ping ke server yang saya jalankan yang kemudian memperbarui repositori publik saya di GitHub.

Ini memungkinkan saya untuk memperlakukan GitHub sebagai remote lain yang dapat saya tarik dari ketika seseorang berkontribusi - kemudian saya menggabungkan --tidak-ff secara lokal, dan ada aliran bagaimana semua repositori primer dan publik saya mendistribusikan perubahan.

diffalot
sumber