تتيح هذه المكتبة استخدام Amazon S3 كخادم git Remote وخادم LFS.
يوفر تطبيقًا لمساعد git البعيد لاستخدام S3 كخادم Git بدون خادم.
كما أنه يوفر أيضًا تنفيذًا للنقل المخصص لـ git-lfs لتمكين دفع الملفات المُدارة بواسطة LFS إلى نفس مجموعة S3 المستخدمة كجهاز تحكم عن بعد.
git-remote-s3
هو برنامج نصي بلغة Python ويعمل مع أي إصدار من Python >= 3.9.
يجري:
pip install git-remote-s3
قبل أن تتمكن من استخدام git-remote-s3
، يجب عليك:
استكمال التكوين الأولي:
قم بإنشاء حاوية AWS S3 (أو لديك واحدة بالفعل) في حساب AWS الخاص بك.
قم بإرفاق الحد الأدنى من السياسة لذلك المستخدم/الدور الذي يسمح لحاوية S3:
{
"Sid" : " S3Access " ,
"Effect" : " Allow " ,
"Action" : [ " s3:PutObject " , " s3:GetObject " , " s3:ListBucket " ],
"Resource" : [ " arn:aws:s3::: " , " arn:aws:s3:::*/* " ]
}
اختياري (ولكنه موصى به) - استخدم مفاتيح حاوية SSE-KMS لتشفير محتوى المجموعة، وتأكد من أن المستخدم/الدور الذي تم إنشاؤه لديه الإذن مسبقًا للوصول إلى المفتاح واستخدامه.
{ "Sid" : " KMSAccess " , "Effect" : " Allow " , "Action" : [ " kms:Decrypt " , " kms:GenerateDataKey " ], "Resource" : [ " arn:aws:kms:: ] }:key/ "
يتم تشفير جميع البيانات أثناء الراحة وأثناء النقل افتراضيًا. لإضافة طبقة إضافية من الأمان، يمكنك استخدام مفاتيح KMS المُدارة بواسطة العميل لتشفير البيانات غير النشطة في حاوية S3. نوصي باستخدام مفاتيح الجرافة لتقليل تكاليف إدارة المفاتيح (KMS).
يتم ضمان التحكم في الوصول إلى جهاز التحكم عن بعد عبر أذونات IAM، ويمكن التحكم فيه على:
يتم تحديد أجهزة التحكم عن بعد في S3 بواسطة البادئة s3://
وعلى الأقل حدد اسم المجموعة. يمكنك أيضًا توفير بادئة مفتاح كما في s3://my-git-bucket/my-repo
وملف تعريف 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
يمكنك بعد ذلك إضافة ملف والالتزام به ودفع التغييرات إلى جهاز التحكم عن بُعد:
echo " Hello " > hello.txt
git add -A
git commit -a -m " hello "
git push --set-upstream origin main
تم تعيين HEAD البعيد لتتبع الفرع الذي تم دفعه أولاً إلى الريبو البعيد. لتغيير فرع HEAD البعيد، احذف كائن HEAD s3://
ثم قم بتشغيل git-remote-s3 doctor s3://
.
لاستنساخ الريبو إلى مجلد آخر، ما عليك سوى استخدام صيغة git العادية باستخدام s3 URI كجهاز تحكم عن بعد:
git clone s3://my-git-bucket/my-repo my-repo-clone
إنشاء الفروع ودفعها يعمل كالمعتاد:
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
يجب أن تعمل جميع عمليات git التي لا تعتمد على الاتصال بالخادم كالمعتاد (على سبيل المثال، git merge
)
لاستخدام LFS، عليك أولاً تثبيت git-lfs. يمكنك الرجوع إلى الوثائق الرسمية حول كيفية القيام بذلك على نظامك.
بعد ذلك، تحتاج إلى تمكين تكامل S3 عن طريق تشغيل الأمر التالي في مجلد الريبو:
lfs-s3-py install
وهو اختصار لـ:
git config --add lfs.customtransfer.lfs-s3-py.path lfs-s3-py
git config --add lfs.standalonetransferagent lfs-s3-py
لنفترض أننا نريد تخزين ملف TIFF في 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
يعتبر عنوان URL الخاص بـ Amazon S3 لحاوية صالحة وبادئة عشوائية لا تحتوي على البنية الصحيحة ضمنها صالحًا.
يقوم git ls-remote
بإرجاع قائمة فارغة ويقوم git clone
باستنساخ مستودع فارغ تم تعيين S3 URI له كأصل بعيد.
% 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)
نصيحة : يمكن استخدام هذا السلوك لإنشاء git repo جديد بسرعة.
نظرًا للطبيعة الموزعة لـ git
، قد تكون هناك حالات (وإن كانت نادرة) حيث يتم تنفيذ عمليتين أو أكثر من git push
في نفس الوقت بواسطة مستخدمين مختلفين مع تعديلهم الخاص لنفس الفرع.
ينفذ أمر git الدفع في خطوتين:
git-remote-s3
الذي يكتب الحزمة إلى مجموعة S3 في المسار refs/heads/
في حالة تنفيذ أمرين (أو أكثر) git push
في نفس الوقت من عملاء مختلفين، في الخطوة 1 يتم جلب نفس المرجع الصالح، ومن ثم يتابع كلا العميلين الخطوة 2، مما يؤدي إلى تخزين حزم متعددة في S3.
يحتوي الفرع الآن على عدة مراجع رأسية، وأي git push
تفشل مع ظهور الخطأ:
error: dst refspec refs/heads/> matches more than one
error: failed to push some refs to 's3:///'
لإصلاح هذه المشكلة، قم بتشغيل الأمر git-remote-s3 doctor
. افتراضيًا، سيتم إنشاء فرع جديد لكل حزمة لا ينبغي الاحتفاظ بها. يمكن للمستخدم بعد ذلك الخروج من الفرع محليًا ودمجه في الفرع الأصلي. إذا كنت تريد بدلاً من ذلك إزالة الحزمة، فحدد --delete-bundle
.
عند استنساخ الريبو باستخدام جهاز التحكم عن بعد S3 لـ LFS، لا يستطيع git-lfs
معرفة كيفية جلب الملفات لأننا لم نضيف التكوين بعد.
يتضمن خطوتين إضافيتين.
% 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
...
لإصلاح:
cd lfs-repo-clone
lfs-s3-py install
git reset --hard main
لإزالة الفروع البعيدة التي لم تعد مستخدمة، يمكنك استخدام الأمر git-s3 delete-branch
. يقوم هذا الأمر بحذف كائن (كائنات) الحزمة من Amazon S3 ضمن مسار الفرع.
لحماية/إلغاء حماية فرع، قم بتشغيل git s3 protect
على التوالي git s3 unprotect
.
يتم تخزين الحزم في حاوية S3 كـ
.
عند إدراج المرجع البعيد (على سبيل المثال بشكل صريح عبر git ls-remote
) فإننا ندرج جميع المفاتيح الموجودة ضمن المعطى المحدد.
عند دفع مرجع جديد (على سبيل المثال، التزام)، نحصل على sha للمرجع، ونجمع المرجع عبر git bundle create
ونخزنه في S3 وفقًا للمخطط أعلاه.
إذا نجحت عملية الدفع، فسيقوم الكود بإزالة الحزمة السابقة المرتبطة بالمرجع.
إذا قام مستخدمان بدفع الالتزام بشكل متزامن استنادًا إلى نفس رأس الفرع الحالي إلى جهاز التحكم عن بُعد، فسيتم كتابة كلتا الحزمتين في الريبو وإزالة الحزمة الحالية. لا يتم فقدان أي بيانات، ولكن لن يكون من الممكن إجراء المزيد من الدفع حتى تتم إزالة جميع الحزم باستثناء واحدة. لهذا يمكنك استخدام الأمر git s3 doctor
.
يقوم تكامل LFS بتخزين الملف في المجموعة المحددة بواسطة URI البعيد، تحت مفتاح
، حيث يكون oid هو المعرف الفريد المعين بواسطة git-lfs للملف.
إذا كان الكائن الذي يحمل نفس المفتاح موجودًا بالفعل، فلن يقوم git-lfs-s3 بتحميله مرة أخرى.
استخدم علامة --verbose
لطباعة بعض معلومات التصحيح عند إجراء عمليات git. سيتم وضع السجلات في stderr.
بالنسبة لعمليات LFS، يمكنك تمكين وتعطيل تسجيل التصحيح عبر git-lfs-s3 enable-debug
و git-lfs-s3 disable-debug
على التوالي. يتم وضع السجلات في .git/lfs/tmp/git-lfs-s3.log
في الريبو.
تم استلهام تكامل git S3 من عمل Bryan Gahagan على git-remote-s3.
استفاد تطبيق LFS من lfs-s3 بواسطة @nicolas-graves. إذا لم تكن بحاجة إلى استخدام وسيلة النقل git-remote-s3، فيجب عليك استخدام هذا المشروع.