Pustaka ini memungkinkan untuk menggunakan Amazon S3 sebagai git remote dan server LFS.
Ini menyediakan implementasi git remote helper untuk menggunakan S3 sebagai server Git tanpa server.
Ini juga menyediakan implementasi transfer kustom git-lfs untuk memungkinkan mendorong file yang dikelola LFS ke bucket S3 yang sama yang digunakan sebagai remote.
git-remote-s3
adalah skrip Python dan berfungsi dengan versi Python apa pun >= 3.9.
Berlari:
pip install git-remote-s3
Sebelum Anda dapat menggunakan git-remote-s3
, Anda harus:
Selesaikan konfigurasi awal:
Buat bucket AWS S3 (atau sudah memilikinya) di akun AWS Anda.
Lampirkan kebijakan minimal ke pengguna/peran yang mengizinkan penggunaan ke bucket S3:
{
"Sid" : " S3Access " ,
"Effect" : " Allow " ,
"Action" : [ " s3:PutObject " , " s3:GetObject " , " s3:ListBucket " ],
"Resource" : [ " arn:aws:s3::: " , " arn:aws:s3:::*/* " ]
}
Opsional (tetapi disarankan) - gunakan kunci Bucket SSE-KMS untuk mengenkripsi konten bucket, pastikan pengguna/peran yang dibuat sebelumnya memiliki izin untuk mengakses dan menggunakan kunci tersebut.
{ "Sid" : " KMSAccess " , "Effect" : " Allow " , "Action" : [ " kms:Decrypt " , " kms:GenerateDataKey " ], "Resource" : [ " arn:aws:kms:: ] }:key/ "
Semua data dienkripsi saat istirahat dan transit secara default. Untuk menambahkan lapisan keamanan tambahan, Anda dapat menggunakan kunci KMS yang dikelola pelanggan untuk mengenkripsi data yang disimpan di bucket S3. Kami menyarankan untuk menggunakan kunci Bucket untuk meminimalkan biaya KMS.
Kontrol akses ke remote dipastikan melalui izin IAM, dan dapat dikontrol di:
Remote S3 diidentifikasi dengan awalan s3://
dan minimal menentukan nama bucket. Anda juga dapat memberikan awalan kunci seperti pada s3://my-git-bucket/my-repo
dan profil s3://my-profile@my-git-bucket/myrepo
.
mkdir my-repo
cd my-repo
git init
git remote add origin s3://my-git-bucket/my-repo
Anda kemudian dapat menambahkan file, melakukan dan mendorong perubahan ke remote:
echo " Hello " > hello.txt
git add -A
git commit -a -m " hello "
git push --set-upstream origin main
HEAD jarak jauh diatur untuk melacak cabang yang telah didorong pertama kali ke repo jarak jauh. Untuk mengubah cabang HEAD jarak jauh, hapus objek HEAD s3://
lalu jalankan git-remote-s3 doctor s3://
.
Untuk mengkloning repo ke folder lain cukup gunakan sintaks git normal menggunakan URI s3 sebagai remote:
git clone s3://my-git-bucket/my-repo my-repo-clone
Membuat cabang dan mendorongnya berfungsi seperti biasa:
cd my-repo
git checkout -b new_branch
touch new_file.txt
git add -A
git commit -a -m " new file "
git push origin new_branch
Semua operasi git yang tidak bergantung pada komunikasi dengan server harus berfungsi seperti biasa (misalnya git merge
)
Untuk menggunakan LFS Anda harus menginstal git-lfs terlebih dahulu. Anda dapat merujuk ke dokumentasi resmi tentang cara melakukan ini di sistem Anda.
Selanjutnya, Anda perlu mengaktifkan integrasi S3 dengan menjalankan perintah berikut di folder repo:
lfs-s3-py install
yang merupakan jalan pintas untuk:
git config --add lfs.customtransfer.lfs-s3-py.path lfs-s3-py
git config --add lfs.standalonetransferagent lfs-s3-py
Misalkan kita ingin menyimpan file TIFF di LFS.
mkdir lfs-repo
cd lfs-repo
git init
git lfs install
lfs-s3-py install
git lfs track " *.tiff "
git add .gitattributes
< put file.tiff in the repo >
git add file.tiff
git commit -a -m " my first tiff file "
git remote add origin s3://my-git-bucket/lfs-repo
git push --set-upstream origin main
URI Amazon S3 untuk bucket yang valid dan awalan arbitrer yang tidak berisi struktur yang tepat di bawahnya, dianggap valid.
git ls-remote
mengembalikan daftar kosong dan git clone
mengkloning repositori kosong yang URI S3-nya ditetapkan sebagai asal jarak jauh.
% git clone s3://my-git-bucket/this-is-a-new-repo
Cloning into 'this-is-a-new-repo'...
warning: You appear to have cloned an empty repository.
% cd this-is-a-new-repo
% git remote -v
origin s3://my-git-bucket/this-is-a-new-repo (fetch)
origin s3://my-git-bucket/this-is-a-new-repo (push)
Tip : Perilaku ini dapat digunakan untuk membuat repo git baru dengan cepat.
Karena sifat git
yang terdistribusi, mungkin ada kasus (walaupun jarang) di mana 2 atau lebih git push
dieksekusi secara bersamaan oleh pengguna berbeda dengan modifikasi mereka sendiri pada cabang yang sama.
Perintah git mengeksekusi push dalam 2 langkah:
git-remote-s3
yang menulis bundel ke bucket S3 di jalur refs/heads/
Jika dua (atau lebih) perintah git push
dijalankan secara bersamaan dari klien yang berbeda, pada langkah 1 referensi valid yang sama diambil, maka kedua klien melanjutkan ke langkah 2, menghasilkan beberapa bundel disimpan di S3.
Cabang sekarang memiliki beberapa referensi kepala, dan git push
berikutnya gagal dengan kesalahan:
error: dst refspec refs/heads/> matches more than one
error: failed to push some refs to 's3:///'
Untuk memperbaiki masalah ini, jalankan perintah git-remote-s3 doctor
. Secara default, ini akan membuat cabang baru untuk setiap bundel yang tidak boleh disimpan. Pengguna kemudian dapat melakukan checkout cabang secara lokal dan menggabungkannya ke cabang asli. Jika Anda ingin menghapus bundel, tentukan --delete-bundle
.
Saat mengkloning repo menggunakan remote S3 untuk LFS, git-lfs
tidak tahu cara mengambil file karena kami belum menambahkan konfigurasinya.
Ini melibatkan 2 langkah tambahan.
% git clone s3://my-git-bucket/lfs-repo lfs-repo-clone
Error downloading object: file.tiff (54238cf): Smudge error: Error downloading file.tiff (54238cfaaaa42dda05da0e12bf8ee3156763fa35296085ccdef63b13a87837c5): batch request: ssh: Could not resolve hostname s3: Name or service not known: exit status 255
...
Untuk memperbaikinya:
cd lfs-repo-clone
lfs-s3-py install
git reset --hard main
Untuk menghapus remote cabang yang sudah tidak terpakai lagi anda dapat menggunakan perintah git-s3 delete-branch
. Perintah ini menghapus objek bundel dari Amazon S3 di bawah jalur cabang.
Untuk melindungi/membuka proteksi cabang, jalankan git s3 protect
masing-masing git s3 unprotect
.
Bundel disimpan dalam bucket S3 sebagai
.
Saat membuat daftar referensi jarak jauh (misalnya secara eksplisit melalui git ls-remote
) kami mencantumkan semua kunci yang ada di bawah .
Saat mendorong ref baru (misalnya komit), kita mendapatkan sha dari ref tersebut, kita menggabungkan ref tersebut melalui git bundle create
dan menyimpannya ke S3 sesuai skema di atas.
Jika push berhasil, kode akan menghapus bundel sebelumnya yang terkait dengan ref.
Jika dua pengguna secara bersamaan mendorong komit berdasarkan kepala cabang saat ini yang sama ke jarak jauh, kedua bundel akan ditulis ke repo dan bundel saat ini dihapus. Tidak ada data yang hilang, tetapi tidak ada dorongan lebih lanjut yang dapat dilakukan hingga semua paket kecuali satu paket dihapus. Untuk ini, Anda dapat menggunakan perintah git s3 doctor
.
Integrasi LFS menyimpan file dalam keranjang yang ditentukan oleh URI jarak jauh, di bawah kunci
, dengan oid adalah pengidentifikasi unik yang ditetapkan oleh git-lfs ke file.
Jika objek dengan kunci yang sama sudah ada, git-lfs-s3 tidak akan mengunggahnya lagi.
Gunakan tanda --verbose
untuk mencetak beberapa informasi debug saat melakukan operasi git. Log akan dimasukkan ke stderr.
Untuk operasi LFS, Anda dapat mengaktifkan dan menonaktifkan logging debug masing-masing melalui git-lfs-s3 enable-debug
dan git-lfs-s3 disable-debug
. Log dimasukkan ke dalam .git/lfs/tmp/git-lfs-s3.log
di repo.
Integrasi git S3 terinspirasi oleh karya Bryan Gahagan di git-remote-s3.
Implementasi LFS mendapat manfaat dari lfs-s3 oleh @nicolas-graves. Jika Anda tidak perlu menggunakan transportasi git-remote-s3 Anda harus menggunakan proyek itu.