GitLab และ LFS ผลักดันด้วยไฟล์ที่หายไป

ฉันมีที่เก็บข้อมูลเก่ามากที่ฉันใช้ และในบางจุดไฟล์ LFS บางไฟล์ก็หายไป ค่อนข้างน้อยของพวกเขา เมื่อฉันพยายามพุชไปยังพื้นที่เก็บข้อมูลใหม่ใน Gitlab ฉันได้รับข้อผิดพลาดต่อไปนี้

 GitLab: LFS objects are missing. Ensure LFS is properly set up or try a manual 

QA อื่นๆ สำหรับ git-lfs (ที่นี่ ที่นี่) ระบุว่าโดยปกติแล้วตัวแปรบางตัวของ git lfs push --all แต่ฉันไม่มี repo ที่ใช้งานได้ ไฟล์เหล่านี้อีกต่อไปและไฟล์เหล่านั้นก็หายไปตลอดกาล Gitlab ละเว้นการกดด้วย --no-verify และยังคงให้ข้อผิดพลาด

การรัน git lfs fetch --all จะให้รายการ OID ที่หายไปจำนวนมาก

[43cb9e6d1d15bb8d31af911aa69a15a67174c5df73dabc85294ce08198cac468] Object does not exist on the server or you don't have permissions to access it: [404] Object does not exist on the server or you don't have permissions to access it
[454907d530534af9cc95903820c0a632a851b45de98ba18e1de117b8a649f8ac] Object does not exist on the server or you don't have permissions to access it: [404] Object does not exist on the server or you don't have permissions to access it
[ce1314f0c4cb05f349540fa144d33faeb2281ae552cf75dc866a8350d90fd2ac] Object does not exist on the server or you don't have permissions to access it: [404] Object does not exist on the server or you don't have permissions to access it
[d5e8925d273cb00341f00d0f40b39f97cced1e833ef687de2d4663836e7f4e45] Object does not exist on the server or you don't have permissions to access it: [404] Object does not exist on the server or you don't have permissions to access it
...

โพสต์อื่น ที่นี่ มีสคริปต์สำหรับลบ LFS ทั้งหมดโดยตรวจสอบทุก ๆ กระทำและลบไฟล์ LFS แต่ดูเหมือนว่าจะส่งผลเสียอย่างมากต่อพื้นที่เก็บข้อมูลในอนาคต อีกประการหนึ่งระบุเส้นทางในการลบไฟล์ LFS ทั้งหมด (ที่นี่)

ปัญหาทั้งหมดเหล่านี้ดูเหมือนจะไม่ค่อยดีนัก:

  1. การลบ LFS จะทำให้ repo ขยายใหญ่ขึ้น และรอยเปื้อนมีแนวโน้มที่จะล้มเหลวสำหรับไฟล์ที่เสียหายอยู่แล้ว
  2. Git pull/push -all ไม่ใช่ตัวเลือกเนื่องจากไฟล์หายไปตลอดกาล
  3. การลบ LFS ไม่ถูกต้อง เนื่องจากเวอร์ชันของไฟล์มีอยู่ในปัจจุบัน มีเพียงออบเจ็กต์ในบางสาขาในอดีตที่หายไป ดังนั้นคำแนะนำทั้งหมดเกี่ยวกับวิธีลบ LFS จะทำให้ Repo เสียหาย

มีวิธีที่จะไม่ให้ GitLab เพิกเฉยไม่ยืนยันหรือกรอง OID เฉพาะเจาะจงออกจากประวัติอย่างมีประสิทธิภาพหรือไม่ ฉันไม่รังเกียจหากไฟล์จะหายไปตลอดกาล แต่ฉันหวังว่าจะรักษาประวัติศาสตร์เอาไว้

ฉันรู้ว่าฉันสามารถเรียกใช้ git log --all -p -S 43cb9e6d1d15bb8d31af911aa69a15a67174c5df73dabc85294ce08198cac468 เพื่อรับคอมมิตและไฟล์ได้ (แม้ว่าจะใช้เวลา 5-10 นาทีในการรัน PER OID ดังนั้นการดำเนินการนี้อาจใช้เวลานานหลายชั่วโมง) แต่ฉันไม่รู้ว่าต้องทำอย่างไร


person Steve    schedule 23.11.2020    source แหล่งที่มา


คำตอบ (1)


ฉันเพิ่งแก้ไขปัญหาเดียวกันโดยขั้นตอนต่อไปนี้:

  • ฉันได้รับเส้นทางสัมพัทธ์ของไฟล์สกปรกโดย git lfs ls-files
  • ฉันดาวน์โหลด BFG Repo Cleaner ได้ที่ https://rtyley.github.io/bfg-repo-cleaner/
  • ฉันรัน bfg ผ่านพารามิเตอร์ --delete-files <DIRTY_FILE_PATH>

บันทึก BFG รายงานคำเตือนต่อไปนี้ให้ฉันทราบ:

Protected commits
-----------------

These are your protected commits, and so their contents will NOT be altered:

 * commit 9edf1837 (protected by 'HEAD') - contains 1 dirty file : 
    - requirements/LMD-SE-10-D11/setupse10d11.exe (132 B )

WARNING: The dirty content above may be removed from other commits, but as
the *protected* commits still use it, it will STILL exist in your repository.

Details of protected dirty content have been recorded here :

<REPO_PATH>/..bfg-report/2021-07-30/14-12-39/protected-dirt/

If you *really* want this content gone, make a manual commit that removes it, 
and then run the BFG on a fresh copy of your repo.

เพื่อที่จะจัดการกับคำเตือนนี้ ซึ่งทำให้ฉันไม่สามารถลบไฟล์สกปรกได้เลย ฉันจึงโคลน repo อีกครั้ง แต่ โดยไม่มิเรอร์

ตอนนี้ ตามที่แนะนำในบันทึก ฉันลบไฟล์สกปรกด้วยการคอมมิต และรันคำสั่ง BFG อีกครั้งด้วยอาร์กิวเมนต์เดียวกัน

ในที่สุดฉันก็ออกคำสั่ง:

git reflog expire --expire=now --all
git gc --prune=now --aggressive

และบังคับให้เขียนประวัติศาสตร์ใหม่โดย git push --force

ผลลัพธ์: ในที่สุดการอ้างอิง LFS ที่สกปรกก็หายไป!

person Antonio Petricca    schedule 30.07.2021