`sshfs -oworkaround = rename` ทำอะไร?


17

สำหรับคลาสระบบปฏิบัติการที่ฉันเรียนฉันต้องเรียกใช้ Freebsd5.4 ตั้งแต่ฉันไม่ต้องการที่จะต่อสู้กับความพยายามที่จะสร้างคอมไพล์อยู่กับรุ่นของ BSD ปล่อยออกมาก่อนคอมไพล์ได้รับการปล่อยตัวผมคิดว่ามันจะเรียบร้อยจะใช้จากประตูชัยเหนือgitsshfs

ฉันพบวิธีแก้ปัญหาที่แนะนำฉันให้sshfsตัวเลือก-o workaround=renameไม่ว่าด้วยวิธีใดก็ตาม

ดูเหมือนว่าจะgitมีความสุข แต่ฉันค่อนข้างสับสนว่าเกิดอะไรขึ้น ...

หน้าคนทั้งหมดพูดเกี่ยวกับวิธีแก้ปัญหาคือ

fix renaming to existing file

แต่ฉันก็งงกับสิ่งที่แปลว่า ...

ตัวเลือกนั้นทำอะไรกันแน่


3
ตัวชี้สำหรับคนที่ต้องการตรวจสอบสิ่งที่มันหมายถึง (และเขียนคำตอบและหวังว่าแพทช์เอกสาร): sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.cเริ่มต้นที่บรรทัด 2300
Derobert

คำตอบ:


10

sshfs ใช้ SSH File Transfer Protocol (SFTP) วิธีแก้ปัญหาที่คุณเปิดใช้งานอยู่คือการแก้ไขความหมายของการดำเนินการเปลี่ยนชื่อ () ผ่านโปรโตคอลนั้นเมื่อชื่อ "ใหม่" มีอยู่แล้ว

พฤติกรรม POSIX สำหรับการเปลี่ยนชื่อ () ในกรณีนี้คือการลบไฟล์ที่มีอยู่และทำการเปลี่ยนชื่อให้สมบูรณ์

ในโปรโตคอล SFTP คุณสามารถเปลี่ยนชื่อไฟล์ด้วยการดำเนินการ SSH_FXP_RENAME อย่างไรก็ตามพฤติกรรมของมันเมื่อชื่อเป้าหมายมีอยู่แล้วดูเหมือนจะขึ้นอยู่กับรุ่นของโปรโตคอลที่คุณใช้และสิ่งที่คุณส่งผ่าน หน้าวิกิพีเดียสำหรับ SFTP โปรโตคอลมีการเชื่อมโยงไป RFCs ร่างต่างๆสำหรับรุ่นต่างๆของโปรโตคอล ในDraft 00ลักษณะการทำงานจะแสดงรายการเป็น:

มันเป็นข้อผิดพลาดหากมีไฟล์ที่มีชื่อที่ระบุโดย newpath อยู่แล้ว

ในแบบร่าง 13ลักษณะการทำงานจะแสดงรายการเป็น

หากค่าสถานะไม่รวม SSH_FXP_RENAME_OVERWRITE และมีไฟล์ที่มีชื่อที่ระบุโดย newpath เซิร์ฟเวอร์จะต้องตอบสนองกับ SSH_FX_FILE_ALREADY_EXISTS

หากค่าสถานะมี SSH_FXP_RENAME_ATOMIC และไฟล์ปลายทางมีอยู่แล้วไฟล์นั้นจะถูกแทนที่ด้วยอะตอมมิก นั่นคือไม่มีช่วงเวลาที่สังเกตได้ทันเวลาโดยที่ชื่อนั้นไม่ได้อ้างถึงไฟล์เก่าหรือไฟล์ใหม่ SSH_FXP_RENAME_ATOMIC หมายถึง SSH_FXP_RENAME_OVERWRITE

เพื่อจัดการกับความล้มเหลวที่เป็นไปได้ของการดำเนินการเปลี่ยนชื่อ () เมื่อชื่อเป้าหมายมีอยู่sshfs จัดเตรียมวิธีแก้ปัญหาต่อไปนี้ (หากเปิดใช้งาน) :

   if (err == -EPERM && sshfs.rename_workaround) {
            size_t tolen = strlen(to);
            if (tolen + RENAME_TEMP_CHARS < PATH_MAX) {
                    int tmperr;
                    char totmp[PATH_MAX];
                    strcpy(totmp, to);
                    random_string(totmp + tolen, RENAME_TEMP_CHARS);
                    tmperr = sshfs_do_rename(to, totmp);
                    if (!tmperr) {
                            err = sshfs_do_rename(from, to);
                            if (!err)
                                    err = sshfs_unlink(totmp);
                            else
                                    sshfs_do_rename(totmp, to);
                    }
            }
    }

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

  • เปลี่ยนชื่อ "เป็น" ถึง "totmp"
  • เปลี่ยนชื่อ "จาก" เป็น "ถึง"
  • ยกเลิกการเชื่อมโยง (ลบ) "totmp"

นี่เป็นการหลีกเลี่ยงความขัดแย้ง "ไฟล์ที่มีอยู่แล้ว" แต่ยังเปลี่ยนความหมายของการดำเนินการเปลี่ยนชื่อ () ซึ่งเป็นสาเหตุที่คุณไม่ต้องการทำตามค่าเริ่มต้น

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