Mendapatkan satu revisi dari Git

14

Memiliki riwayat revisi Git penuh memiliki banyak manfaat sebagai bagian dari proses pengembangan.

Tetapi produk kami adalah kode sumber, kami menggunakan bahasa skrip yang tidak memerlukan kompilasi atau pemrosesan, dan kemudian sejarah Git menjadi beban penerapan - dalam contoh kami, kami menerapkan lingkungan virtual yang bersih mengikuti setiap perubahan, memiliki beberapa penyebaran pada satu mesin.

Ada beberapa cara untuk mengurangi jumlah sejarah, misalnya klon dangkal yang efisiensinya tergantung pada seberapa dalam revisi di cabang, melakukan pengambilan alih-alih klon tetapi kemudian Anda masih mendapatkan sejarah dari revisi dan kembali, atau mendapatkan penuh Repo sekali lalu tarik ketika dibutuhkan tetapi ini boros dalam hal ruang disk dan cenderung kurang dapat diandalkan.

Apakah ada cara untuk mendapatkan satu revisi dari Git tanpa riwayatnya?

Rsf
sumber
1
T&J terkait di SO stackoverflow.com/questions/26135216/…
Evgeny

Jawaban:

16

Klon dangkal

Anda memang bisa mendapatkan klon dangkal dari Git menggunakan:

git clone --depth=1 <url>

Ini masih akan mengkloning repo dan membuat .gitfolder dengan objek, hanya dalam ukuran lebih kecil (perbedaan tergantung pada ukuran file total Anda vs ukuran sejarah).

Arsip git

Anda juga dapat menggunakan git-arsip untuk mengekstrak arsip repo:

Membuat arsip format tertentu yang berisi struktur pohon untuk pohon bernama, dan menuliskannya ke output standar. Jika ditentukan itu diawali dengan nama file dalam arsip.

Dalam contoh yang ditunjukkan misalnya:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

Buat tarball terkompresi untuk rilis .

Host Git, arsipkan API

Jika Anda meng-hosting repo Anda di GitHub, maka Anda dapat menggunakan API arsipnya :

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

Bitbucket.org memiliki fungsi yang sama untuk ini:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip

7ochem
sumber
7ochem, mungkin perintah gzip harus berupa gzip -c ....
Romeo Ninov
11

Jangan gunakan git repo Anda. Kembangkan metodologi penyebaran nyata. Bahkan jika itu semudah membuat arsip (= membangun artefak hanya dengan file yang diperlukan di dalamnya untuk digunakan) skrip yang digunakan.

Bahkan jika Anda akan mengkloning ujung repositori sumber Anda, Anda mungkin tidak memerlukan tes unit, dokumentasi, profil linting, dan ephemera pendukung lainnya di lingkungan yang Anda gunakan.

Catatan : untuk repositori bahasa skrip yang tidak benar-benar memiliki langkah "build", cara sepele untuk melepaskan artefak adalah dengan mengemasnya dalam arsip, seperti tar atau rpm. Kemudian, untuk "menyebarkan", Anda menghapus arsip atau menginstal rpm. ini menghilangkan kebutuhan untuk tool git dalam rantai penyebaran Anda (tidak semua server prod memiliki alat dev tersebut).

RubyTuesdayDONO
sumber
tidak apa-apa untuk mempertanyakan (atau bahkan menantang!) jawaban - itulah yang membuat Stack Exchange hebat :) untuk repositori bahasa skrip yang tidak benar-benar memiliki langkah "build", cara sepele untuk melepaskan artefak adalah dengan mengemas mereka dalam arsip, seperti tar atau rpm. kemudian, untuk "menyebarkan", Anda membatalkan pengarsipan atau menginstal rpm. ini menghilangkan perlunya git tooling dalam rantai penyebaran Anda (tidak semua server prod memiliki alat dev tersebut)
RubyTuesdayDONO
1
@ Pierre. Ya betul, Anda kehilangan apa yang disarankan sebagai pengarsipan arsip, yaitu membangun artefak dengan hanya file yang diperlukan di dalamnya untuk digunakan. Yang mengatakan saya setuju itu bukan jawaban yang berkualitas dan poin ini harus diperpanjang. Kami dalam versi beta pribadi dan jawaban harus née eksplisit
Tensibai
Maka saya tidak melihat apa yang membawa lebih dari jawaban yang diterima, jika itu mengarah ke arsip fit ... itu hanya berlebihan, Anda harus mengedit untuk memperluas dengan cara ini iMHo
Tensibai
1
Silakan periksa edit saya atas jawaban Anda (cukup sertakan komentar menarik Anda). Merasa bebas untuk memperbaiki / mengerjakan ulang tentu saja, atau hanya mengembalikan jika Anda tidak suka edit saya sama sekali. BTW: komentar Anda (= catatan yang saya tambahkan) membuat saya berpikir seperti "sungguh, sesederhana itu? Sekali lagi contoh tentang bagaimana kita Mendapatkan Hal-hal yang Dilakukan dalam zOS ... dengan z untuk downtime nol ...". Saya pikir inilah saatnya untuk mulai mempertanyakan lebih banyak pertanyaan / jawaban melalui komentar serupa ... Jangan terlalu banyak menantangku ...
Pierre.Vriens
saya tidak mengatakan bahwa ini adalah jawaban yang lengkap atau model, tetapi saya tidak melihat orang lain menangani gajah di ruangan: jika Anda menggunakan git untuk "menyebarkan" proyek Anda, Anda "akan memiliki waktu yang buruk" ;)
RubyTuesdayDONO
6

Pertanyaan apakah ada cara untuk mendapatkan satu revisi dari Git tanpa riwayatnya?

Untuk mendapatkan repositori, tidak ada cara, terutama karena tidak ada 'revisi'. Git store berkomitmen, yang merupakan perubahan dari kondisi sebelumnya.
Jika Anda ingin repositori pada titik waktu tertentu, Anda harus menarik komit saat ini dan semua leluhurnya atau Anda hanya akan mendapatkan perubahan yang dilakukan di komit.

Untuk menghindari kebingungan: Kloning dangkal mendapatkan sejarah yang diperlukan dan kemudian memotongnya untuk membebaskan ruang, pohon itu masih dibuat dari sejarah.

Untuk solusinya, jawaban @ 7ochem tidak mencakup mereka.

Tensibai
sumber