ไม่สามารถพุชไปที่ GitHub ได้เพราะไฟล์ขนาดใหญ่ที่ฉันลบไปแล้ว


272

ปัจจุบันฉันมี

  1. ล้าง GitHub repo
  2. เซิร์ฟเวอร์ repos SSH (หลัก)
  3. Repo ท้องถิ่น

SSH เซิร์ฟเวอร์ repo เป็น repo ที่ทันสมัยที่สุด (ไซต์ที่ใช้งานจริง) ดังนั้นฉันจึงทำ Git clone จากที่นั่นไปยังท้องถิ่น จากนั้นฉันก็ลองทำgit pushกับ GitHub

ทุกอย่างก็โอเค แต่มันก็พูดอะไรบางอย่างเกี่ยวกับ filename.gz ใหญ่เกินไปสำหรับ GitHub ฉันไม่ต้องการไฟล์นี้ดังนั้นฉันจึงรันคำสั่ง Git หลายคำเพื่อกำจัดมันออกจากแคช Git แล้วผลักกลับไปที่เซิร์ฟเวอร์ SSH

ฉันไม่เห็นไฟล์ขนาดใหญ่ในเครื่อง แต่ยังคงอยู่บนเซิร์ฟเวอร์ SSH แม้ว่าgit diffจะไม่ส่งคืนอะไรเลยและ git push จะส่งคืน "ทุกอย่างเป็นปัจจุบัน" - และแม้ว่าไฟล์จะไม่ปรากฏใน repo ในพื้นที่เมื่อฉันพยายามกด GitHub ฉันยังคงได้รับข้อผิดพลาดเกี่ยวกับเรื่องนี้

ระยะไกล: ข้อผิดพลาด: ไฟล์ fpss.tar.gz คือ 135.17 MB ซึ่งเกินขนาด จำกัด ของไฟล์ GitHub เป็น 100 MB

ฉันทำตามขั้นตอนภายใต้ "การแก้ไขปัญหา" ที่ระบุไว้ใน GitHub ช่วยด้วยดังนั้นไม่ควรพอ?

ไฟล์ยังคงอยู่ในอีเธอร์อย่างไรเมื่อไม่อยู่ในพื้นที่หรืออยู่ในสถานะ git / diff / push?


2
ไฟล์ยังคงอยู่ในประวัติ คุณต้องทำลายประวัติโดยอาจเป็นการบีบคอมมิตที่เพิ่มและลบไฟล์
Shahbaz

@Shahbaz ฉันทำตามขั้นตอนภายใต้ "การแก้ไขปัญหา" ที่ระบุไว้ในเว็บไซต์นี้ ... ไม่ควรจะเพียงพอหรือไม่ help.github.com/articles/working-with-large-files
Kevin W.

คำสั่งมีความก้าวหน้ามากกว่าความรู้เรื่องคอมไพล์ของฉันดังนั้นฉันจึงบอกไม่ได้จริงๆ อย่างไรก็ตามหากgit log -- the_big_fileคุณส่งคืนอะไรให้คุณไฟล์นั้นก็ยังอยู่ในประวัติ
Shahbaz

@Shahbaz ที่กลับมาไม่มีอะไร> <
Kevin W.

เป็นไปได้ไหมที่คุณจะผลักสาขาอื่น ๆ ที่มีไฟล์อยู่ด้วย? นอกจากนี้หากไฟล์ยังอยู่บนเซิร์ฟเวอร์ทำไมจะgit pushบอกว่าทุกอย่างทันสมัย เมื่อคุณเปลี่ยนประวัติศาสตร์มันควรจะบ่นว่าการกดเป็นไปไม่ได้และคุณจะต้องบังคับมัน
Shahbaz

คำตอบ:


446

คุณสามารถใช้ได้

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

การดำเนินการนี้จะลบทุกอย่างในประวัติของไฟล์นั้น ปัญหาคือไฟล์นั้นมีอยู่ในประวัติศาสตร์

คำสั่งนี้เปลี่ยนแฮชของการยืนยันของคุณซึ่งอาจเป็นปัญหาจริงโดยเฉพาะอย่างยิ่งในที่เก็บที่ใช้ร่วมกัน ไม่ควรดำเนินการโดยไม่เข้าใจผลที่ตามมา


23
ทำงานให้ฉัน แต่ฉันต้อง 'บังคับ' มัน: git filter-branch --index-filter 'git rm -r - เก็บไว้ --ignore-unmatch <ไฟล์ / dir>' -f HEAD
alexoviedo999

30
คำสั่งนี้เปลี่ยนแฮชของการยืนยันของคุณซึ่งอาจเป็นปัญหาจริงโดยเฉพาะอย่างยิ่งในที่เก็บที่ใช้ร่วมกัน ไม่ควรดำเนินการโดยไม่เข้าใจผลที่ตามมา
Chris

6
คุณควรจะแทนที่ <file / dir> ด้วยชื่อของไฟล์หรือ dir ที่ทำให้เกิดปัญหาหรือไม่?
David Rhoden

12
โปรดทราบว่าหากคุณต้องการใช้การเปลี่ยนแปลงเหล่านี้กับสาขาทั้งหมดคุณต้องใช้การ--allตั้งค่าสถานะแทนHEAD
Nick Spreitzer

9
ฉันได้รับ:Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected
João Abrantes

68

ผมพบว่าsquashingfilter-branchประโยชน์มากกว่า ฉันทำต่อไปนี้:

  1. ลบไฟล์ขนาดใหญ่ในเครื่อง
  2. กระทำการลบในเครื่อง
  3. ซอฟท์รีเซ็ตจำนวนกลับเอ็กซ์กระทำ (สำหรับฉันมันเป็น git reset --soft HEAD~33):
  4. จากนั้นแนะนำการเปลี่ยนแปลงทั้งหมดเข้าด้วยกัน (สควอช AKA) git commit -m "New message for the combined commit"
  5. กดสควอช

กรณีพิเศษ (จากผู้ใช้ @lituo): หากด้านบนไม่ทำงานคุณอาจมีกรณีนี้ Commit 1 รวมไฟล์ขนาดใหญ่และการส่งข้อมูล Commit 1 ล้มเหลวเนื่องจากข้อผิดพลาดไฟล์ขนาดใหญ่ Commit 2 ลบไฟล์ขนาดใหญ่โดยgit rm --cached [file_name]การกด Commit 2 ยังคงล้มเหลว คุณสามารถทำตามขั้นตอนเดียวกันข้างต้น แต่แทนที่จะใช้การใช้งานHEAD~3HEAD~2


2
ทำงานให้ฉันได้เพียงแค่รวมการเปลี่ยนแปลงจากสามคอมมิทกลับเข้าไปในพื้นที่เก็บข้อมูลในพื้นที่ของฉันก่อนที่จะกดสควอชทำงาน
dasWesen

5
นี่เป็นคำตอบที่ดีกว่ามาก คำตอบที่ดีที่สุดจะไขปริศนาประวัติศาสตร์ของคุณ
manic.coder

ไม่ได้แก้ไขปัญหาของฉัน
Hirak Sarkar

3
นี่เป็นเพียงคำตอบเดียวที่แก้ไขไฟล์ที่ไม่มีข้อผูกมัดหรือไฟล์ที่มีขนาดใหญ่ อัปเดตแล้วจึงสามารถเลื่อนไปด้านบน :-)
13lex

1
@ แต่ฉันไม่ได้เป็นคลาส wrapper: ขอบคุณมาก! สิ่งนี้ใช้งานได้อย่างมีเสน่ห์ :)
POOJA GUPTA

63

นี่คือสิ่งที่ฉันพบว่ามีประโยชน์มากถ้าคุณยุ่งกับ repo ของคุณก่อนที่คุณจะขอความช่วยเหลือ ประเภทแรก:

git status

หลังจากนี้คุณจะเห็นบางสิ่งบางอย่างตามแนวของ

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

ส่วนที่สำคัญคือ "2 กระทำ"! จากที่นี่ไปข้างหน้าและพิมพ์:

git reset HEAD~<HOWEVER MANY COMMITS YOU WERE BEHIND>

ดังนั้นสำหรับตัวอย่างข้างต้นหนึ่งจะพิมพ์:

git reset HEAD~2

หลังจากคุณพิมพ์แล้ว "สถานะ git" ของคุณควรพูดว่า:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

จากตรงนั้นคุณสามารถลบไฟล์ขนาดใหญ่ (สมมติว่าคุณยังไม่ได้ทำ) และคุณควรจะสามารถคอมมิชชันใหม่อีกครั้งโดยไม่สูญเสียงานของคุณ
ฉันรู้ว่านี่ไม่ใช่คำตอบแฟนซียอดเยี่ยม แต่ฉันหวังว่ามันจะช่วยได้!


11
ผู้ชนะ วิธีแก้ปัญหาที่เรียบง่ายสะอาดมีประสิทธิภาพและคอมไพล์ รักคำตอบเช่นนี้
Reece Daniels

3
นี่เป็นทางออกที่ดีที่สุด
wrahool

40

หากไฟล์ถูกเพิ่มด้วยการคอมมิชชันล่าสุดของคุณและคุณยังไม่ได้พุชไปยังที่เก็บรีโมตคุณสามารถลบไฟล์และแก้ไขการคอมมิชชัน, ถ่ายจากที่นี่ :

git rm --cached giant_file
    # Stage "giant_file" for removal with "git rm"
    # Leave it on disk with "--cached". if you want to remove it from disk
    # then ignore the "--cached" parameter
git commit --amend -CHEAD
    # Commit the current tree without the giant file using "git commit"
    # Amend the previous commit with your change "--amend" 
    # (simply making a new commit won't work, as you need
    # to remove the file from the unpushed history as well)
    # Use the log/authorship/timestamp of the last commit (the one we are
    # amending) with "-CHEAD", equivalent to --reuse-message=HEAD
git push
    # Push our rewritten, smaller commit with "git push"

1
การแก้ปัญหานี้จะไม่ทำงานตั้งแต่ไฟล์ไม่ได้อีกต่อไปในดัชนีคอมไพล์ (มันจะส่งผลเป็นuntrackedรายชื่อไฟล์ที่git status.
loretoparisi

ไม่มีอะไรเกิดขึ้น หลังจากใช้สิ่งนี้จะลดจำนวนการนับไฟล์ทั้งหมด แต่หลังจากแสดงกระบวนการ 99% มันติดขัดอีกครั้ง ข้อเสนอแนะใด ๆ สิ่งที่ฉันหายไป?
CoDe

4
-CHEAD หมายถึงอะไร
Aerin

1
ถ้าฉันต้องการลองสิ่งนี้จากการกระทำที่เฉพาะเจาะจงไม่ใช่การกระทำสุดท้าย ฉันลองแล้วgit rm --cached giant_file commit_idแต่มันใช้งานไม่ได้ :(
puifais

@puifais ฉันจะย้อนกลับไปสู่การคอมมิชชันก่อนหน้าทำตามขั้นตอนเหล่านี้แล้วรวมเข้ากับคอมมิชชันปัจจุบัน ฉันไม่แน่ใจว่านี้เป็นวิธีที่ดีที่สุดฉันไม่ได้เป็นผู้เชี่ยวชาญ Git
BlueMoon93

13

ฉันมีปัญหาที่คล้ายกันและใช้ขั้นตอนข้างต้นเพื่อลบไฟล์ มันทำงานได้อย่างสมบูรณ์

ฉันได้รับข้อผิดพลาดในไฟล์ที่สองที่ฉันต้องการลบ: remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB

ฉันลองทำขั้นตอนเดียวกันแล้วพบข้อผิดพลาด: "A previous backup already exists in <path/filename>"

จากการวิจัยในเว็บไซต์นี้ฉันใช้คำสั่ง:git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all

ใช้งานได้ดีมากและไฟล์ขนาดใหญ่ก็ถูกลบออกไป

ไม่น่าเชื่อการผลักดันยังคงล้มเหลวด้วยข้อผิดพลาดอื่น: error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly

ฉันนี้แก้ไขโดยการแก้ไขไฟล์. git config โดยตรง - postBuffer = 999999999

หลังจากนั้นการผลักก็ผ่านไป!


1
gotcha เพิ่มเติมที่ฉันต้องต่อสู้กับการลบไฟล์ขนาดใหญ่ (ดังกล่าวข้างต้น) คือหนึ่งในโฟลเดอร์ที่มี hash # ตัวอักษรในนั้น เรื่องนี้ทำให้ไม่มีปัญหาสำหรับการดำเนินการคอมไพล์ปกติ แต่สำหรับgit rmฉันจำเป็นต้องให้ชื่อพา ธ ที่เก็บแบบเต็มสำหรับไฟล์และเพื่อหลีกเลี่ยง # ด้วยแบ็กสแลชเพื่อให้มันทำงาน
jacanterbury

สิ่งนี้ได้ผลกับฉันเช่นกัน ฉันหลีกเลี่ยงreset hardขั้นตอนที่ด้านล่างของหน้าด้วยการกดง่าย ๆ czettner.com/2015/07/16/…
Monte Hayward

สิ่งนี้ทำงานหลังจากเรียกใช้ 'git push -f origin' ด้วย
kezzos

12

ทำไม GitHub จึงปฏิเสธ repo ของฉันแม้ว่าฉันจะลบไฟล์ขนาดใหญ่แล้วล่ะ

Git เก็บประวัติทั้งหมดของโครงการของคุณดังนั้นแม้ว่าคุณจะ 'ลบ' ไฟล์จากโครงการของคุณ Git repo ยังคงมีสำเนาของไฟล์ในประวัติของมันและถ้าคุณพยายามที่จะผลักดันไปยังพื้นที่เก็บข้อมูลอื่น (เช่นโฮสต์ที่ GitHub) จากนั้น Git ต้องการ repo ระยะไกลที่มีประวัติเหมือนกับที่ repo ในพื้นที่ของคุณทำ (เช่นไฟล์ขนาดใหญ่เดียวกันในประวัติของมัน)

ฉันจะทำให้ GitHub ยอมรับการซื้อคืนได้อย่างไร

คุณต้องล้างประวัติ Git ของโครงการในพื้นที่ลบไฟล์ขนาดใหญ่ที่ไม่ต้องการออกจากประวัติทั้งหมดจากนั้นใช้ประวัติ 'ล้าง' ต่อไปเท่านั้น Git ส่งรหัสของการกระทำที่ได้รับผลกระทบจะเปลี่ยนไป

ฉันจะล้างไฟล์ขนาดใหญ่ออกจาก repo Git ของฉันได้อย่างไร

เครื่องมือที่ดีที่สุดสำหรับการล้างไฟล์ขนาดใหญ่ที่ไม่ต้องการออกจากประวัติ Git คือBFG Repo-Cleaner - เป็นทางเลือกที่ง่ายกว่าและเร็วกว่าgit-filter-branchสำหรับการออกแบบโดยเฉพาะสำหรับการลบไฟล์ที่ไม่ต้องการออกจากประวัติ Git

ปฏิบัติตามคำแนะนำการใช้งานอย่างระมัดระวังส่วนแกนหลักเป็นเพียงแค่นี้:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

ไฟล์ใด ๆ ที่มีขนาดเกิน 100MB (ซึ่งไม่ได้อยู่ในการส่งล่าสุดของคุณ) จะถูกลบออกจากประวัติของที่เก็บ Git ของคุณ จากนั้นคุณสามารถใช้git gcเพื่อล้างข้อมูลที่ตายแล้ว:

$ git gc --prune=now --aggressive

โดยทั่วไปแล้ว BFG นั้นเร็วกว่าการรันอย่างน้อย10-50เท่าgit-filter-branchและใช้งานได้ง่ายกว่ามาก

การเปิดเผยอย่างสมบูรณ์: ฉันเป็นผู้แต่ง BFG Repo-Cleaner


1
กรณีของฉันมีภาวะแทรกซ้อนเพิ่มเติมที่ห้ามการบีบ เครื่องมือ BFG ใช้งานได้ดีมาก ขอบคุณ
dantopa

นี่เป็นวิธีแก้ปัญหาที่น่า
อัศจรรย์

4

ฉันมีปัญหาเดียวกันและไม่มีคำตอบใดที่เหมาะกับฉัน ฉันแก้ไขตามขั้นตอนต่อไปนี้:

1. ค้นหาการกระทำที่มีไฟล์ขนาดใหญ่

git log --all -- 'large_file`

ความมุ่งมั่นล่างเป็นกระทำที่เก่าแก่ที่สุดในรายการผลลัพธ์

2. ค้นหาอันที่เก่าแก่ที่สุดก่อน

git log

สมมติว่าคุณได้รับ:

commit 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

3. Git rebase

git rebase -i 3f7dd04a6e6dbdf1fff92df1f6344a06119d5d32

เคล็ดลับ :

  1. รายการสินค้า
  2. ฉันเพิ่งเลือกคอมมิทdropที่มีไฟล์ขนาดใหญ่
  3. คุณอาจพบข้อขัดแย้งระหว่างการรีบูตแก้ไขและใช้git rebase --continueเพื่อดำเนินการต่อจนกว่าคุณจะเสร็จสิ้น
  4. หากมีสิ่งใดผิดพลาดในระหว่างการรีบูตใช้git rebase --abortเพื่อยกเลิก

4

ฉันลองใช้วิธีการทั้งหมดข้างต้นแล้ว แต่ก็ไม่มีวิธีใดที่เหมาะกับฉัน

จากนั้นฉันก็คิดวิธีแก้ปัญหาของตัวเอง

  1. ก่อนอื่นคุณต้องมีธุรกรรมซื้อคืนภายในที่สะอาดและทันสมัย ลบไฟล์ขนาดใหญ่ทั้งหมด

  2. ตอนนี้สร้างโฟลเดอร์ใหม่นอกโฟลเดอร์ repo ของคุณและใช้ "Git create repository ที่นี่" เพื่อสร้างเป็น repository Git ใหม่เรียกมันว่า new_local_repo นี่ไง! วิธีการทั้งหมดข้างต้นบอกว่าคุณต้องล้างประวัติ ... เอาล่ะฉันเบื่อแล้วลองสร้าง repo ใหม่ที่ไม่มีประวัติเลย!

  3. คัดลอกไฟล์จาก repo ในพื้นที่ของคุณไปยัง repo ที่ใหม่และสวยงาม โปรดทราบว่าโลโก้สีเขียวบนไอคอนโฟลเดอร์จะหายไปสิ่งนี้มีแนวโน้มเพราะนี่เป็น repo ใหม่!

  4. มุ่งมั่นที่สาขาท้องถิ่นแล้วกดไปที่สาขาใหม่ระยะไกล เรียกมันว่า new_remote_branch หากคุณไม่ทราบวิธีการผลักดันจาก repo ท้องถิ่นใหม่ Google มัน

  5. ยินดีด้วย! คุณได้ส่งรหัสที่สะอาดและทันสมัยไปที่ GitHub หากคุณไม่ต้องการสาขาหลักระยะไกลอีกต่อไปคุณสามารถทำให้ new_remote_branch เป็นสาขาต้นแบบใหม่ได้ หากคุณไม่ทราบวิธีการใช้งาน Google

  6. ขั้นตอนสุดท้ายถึงเวลาที่จะลบ repo ท้องถิ่นที่เก่าแก่แล้ว ในอนาคตคุณจะใช้ new_local_repo เท่านั้น



1

วิธีแก้ปัญหาเพื่อเก็บไฟล์ / โฟลเดอร์ขนาดใหญ่ไว้ในโฟลเดอร์ทำงาน

นี่คือบรรทัดที่ใช้ในการแก้ปัญหาที่ถามที่นี่ (จากคำตอบ 1):

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

คำสั่งนี้จะลบไฟล์ / dir ด้วยถ้าไฟล์ / dir อยู่ในแผนผังการทำงาน

หากคุณต้องการเก็บไฟล์ / โฟลเดอร์ไว้ในแผนผังการทำงานฉันขอแนะนำให้ทำตามขั้นตอนต่อไปนี้

  1. หลังจากทำงานผิดพลาด git reset HEAD^
  2. เพิ่มไฟล์ / โฟลเดอร์ที่สงสัยลงในไฟล์ `` .gitignore```

  3. ดำเนินการตามปกติgit add .ซึ่งอาจจับไฟล์ / โฟลเดอร์อื่น แต่ต้องจับ.gitignoreไฟล์ ต่อไปคือgit commit -m"message"และในที่สุดgit push origin <branch_name>


0

สิ่งนี้ใช้ได้สำหรับฉัน เอกสารจาก GitHub Squashing Git มุ่งมั่นที่จะต้นกำเนิดการตั้งค่า Git / ต้นแบบ

git checkout master && git pull;
git merge feature_branch;
git add . --all;
git commit -m "your commit message"

ค้นหาเอกสารที่นี่


0

ฉันกำลังเพิ่มคำตอบแรก

git filter-branch - ดัชนีตัวกรอง 'git rm -r - เก็บไว้ --ignore-unmatch' HEAD

จะมีความขัดแย้งในการผสานจากที่มา / หลัก

สาขาและ 'ต้นกำเนิด / ปรมาจารย์' ของคุณมีการแยกส่วนและมีการกระทำที่แตกต่างกัน 114 และ 109 ครั้งตามลำดับ (ใช้ "git pull" เพื่อรวมสาขาระยะไกลเข้ากับคุณ)

กรุณาเรียกใช้สิ่งนี้

รีเซ็ต git - แหล่งกำเนิด / มาสเตอร์

มันจะทำให้การเปลี่ยนแปลงที่ไม่มีการแบ่งระยะของฉันหมดไปและลืมทุกอย่างในสาขาท้องถิ่นปัจจุบันของฉันและทำให้มันเหมือนกับที่มา / อาจารย์


0

ดังนั้นฉันจึงพบกับสถานการณ์ที่เฉพาะเจาะจง: ฉันโคลนที่เก็บจาก gitlab ซึ่งมีไฟล์ที่มีขนาดใหญ่กว่า 100 mb แต่ถูกลบออกในบางจุดในประวัติศาสตร์ git หลังจากนั้นเมื่อฉันเพิ่ม repo ส่วนตัว github ใหม่และพยายามที่จะผลักดันไปยัง repo ใหม่ฉันได้รับข้อผิดพลาด 'ไฟล์ใหญ่เกินไป' ข้อผิดพลาด ณ จุดนี้ฉันไม่สามารถเข้าถึง repo gitlab ดั้งเดิมได้อีกต่อไป อย่างไรก็ตามฉันยังสามารถกดไปยัง repo GitHub ส่วนตัวใหม่โดยใช้bfg-repo-cleanerที่เก็บ LOCAL บนเครื่องของฉัน:

$ cd ~
$ curl https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar > bfg.jar
$ cd my-project
$ git gc
$ cd ../
$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-project
$ cd my-project
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git remote -v # confirm origin is the remote you want to push to
$ git push origin master

0

บางครั้งไฟล์ถูกเก็บไว้ในประวัติการติดตามลองทำตามขั้นตอนต่อไปนี้:

  1. git commitหากคุณเห็นโหมดการสร้างโดยมีไฟล์ขนาดใหญ่อยู่ในรายการให้ทำดังนี้
  2. git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD. คุณควรเห็น Rewrites จำนวนมากปรากฏในคอนโซลซึ่งลงท้ายด้วย:

    rm 'ชื่อไฟล์' และ

    Refบรรทัดสุดท้ายถูกเขียนใหม่

มันจบแล้ว.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.