ไลบรารีนี้ทำให้สามารถใช้ Amazon S3 เป็น git ระยะไกลและเซิร์ฟเวอร์ 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 ระยะไกลได้รับการตั้งค่าให้ติดตามสาขาที่ถูกพุชไปยัง repo ระยะไกลก่อน หากต้องการเปลี่ยนสาขา HEAD ระยะไกล ให้ลบวัตถุ HEAD s3://
จากนั้นเรียกใช้ git-remote-s3 doctor s3://
หากต้องการโคลน repo ไปยังโฟลเดอร์อื่น เพียงใช้ไวยากรณ์ 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 merge
)
หากต้องการใช้ LFS คุณต้องติดตั้ง git-lfs ก่อน คุณสามารถดูเอกสารอย่างเป็นทางการเกี่ยวกับวิธีการดำเนินการนี้ในระบบของคุณ
ถัดไป คุณต้องเปิดใช้งานการรวม S3 โดยเรียกใช้คำสั่งต่อไปนี้ในโฟลเดอร์ repo:
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
Amazon S3 URI สำหรับบัคเก็ตที่ถูกต้องและคำนำหน้าที่กำหนดเองซึ่งไม่มีโครงสร้างที่ถูกต้องอยู่ภายใต้นั้นถือว่าใช้ได้
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)
เคล็ดลับ : ลักษณะการทำงานนี้สามารถใช้เพื่อสร้าง repo git ใหม่ได้อย่างรวดเร็ว
เนื่องจากลักษณะการกระจายของ git
อาจมีกรณี (แม้ว่าจะหายาก) ที่ดำเนินการ git push
2 รายการขึ้นไปในเวลาเดียวกันโดยผู้ใช้ที่แตกต่างกันโดยมีการแก้ไขสาขาเดียวกันด้วยตนเอง
คำสั่ง git ดำเนินการพุชใน 2 ขั้นตอน:
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
เมื่อทำการโคลน repo โดยใช้รีโมต S3 สำหรับ LFS git-lfs
จะไม่ทราบวิธีดึงไฟล์เนื่องจากเรายังไม่ได้เพิ่มการกำหนดค่า
มันเกี่ยวข้องกับ 2 ขั้นตอนพิเศษ
% 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 ตามสคีมาด้านบน
หากการพุชสำเร็จ โค้ดจะลบบันเดิลก่อนหน้าที่เกี่ยวข้องกับการอ้างอิง
หากผู้ใช้สองคนส่งการคอมมิตตามส่วนหัวสาขาปัจจุบันเดียวกันไปยังรีโมตพร้อมกัน บันเดิลทั้งสองจะถูกเขียนไปยัง repo และบันเดิลปัจจุบันจะถูกลบออก ไม่มีข้อมูลสูญหาย แต่จะไม่มีการพุชอีกต่อไปจนกว่าบันเดิลทั้งหมดจะถูกลบออก คุณสามารถใช้คำสั่ง 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
ใน repo
การบูรณาการ git S3 ได้รับแรงบันดาลใจจากงานของ Bryan Gahagan บน git-remote-s3
การใช้งาน LFS ได้รับประโยชน์จาก lfs-s3 โดย @nicolas-graves หากคุณไม่จำเป็นต้องใช้การขนส่ง git-remote-s3 คุณควรใช้โปรเจ็กต์นั้น