SeaMeet Desktop มาแล้ว — บันทึกทุกอย่าง ไม่พลาดสิ่งใด ดาวน์โหลดฟรี →

การตั้งค่า GitHub Sync

บทที่ 38: การตั้งค่า GitHub Sync

GitHub Sync เปลี่ยน SeaMeet workspace ของคุณเป็นต้นไม้ Markdown ส่วนตัวที่มีการควบคุมเวอร์ชันซึ่งอาศัยอยู่ในที่เก็บ GitHub ของคุณเอง ทุกครั้งที่คุณแก้ไข note เปลี่ยนชื่อการบันทึก หรือปรับแต่งหน้า wiki SeaMeet จะ commit การเปลี่ยนแปลงในพื้นหลังอย่างเงียบๆ และ push ไปยัง GitHub เปิด SeaMeet บนแล็ปท็อปอื่น และ notes ของคุณจะถูก pull ลงในการเปิดตัวครั้งแรก — ไม่มี Dropbox อยู่ตรงกลาง ไม่มีเซิร์ฟเวอร์ Seasalt ใน loop ที่เก็บเป็นของคุณ ข้อมูลเป็นของคุณ และคุณสามารถเรียกดูได้โดยตรงบน github.com หากคุณต้องการ

โมเดลง่ายๆ: ที่เก็บ GitHub ของคุณเป็นที่จัดเก็บ SeaMeet ไม่ได้รันบริการซิงค์ มันติดตั้ง GitHub App ขนาดเล็กในบัญชีของคุณ ได้รับ token OAuth ต่อผู้ใช้ และใช้ token นั้นในการ push และ pull Git commits โดยตรง เนื่องจากการจัดเก็บเป็นระดับฟรีของ GitHub — ซึ่งให้ private repos ไม่จำกัด — sync จึงเป็นฟรีอย่างมีประสิทธิภาพ และเนื่องจากแต่ละ SeaMeet workspace เป็นที่เก็บของตัวเอง คุณสามารถแยก workspaces งานและส่วนตัวได้อย่างสมบูรณ์


วัตถุประสงค์ของบท

หลังจากอ่านบทนี้ คุณจะสามารถ:

  • ติดตั้ง SeaMeet GitHub App ในบัญชีหรือองค์กรของคุณ
  • อนุญาต SeaMeet ผ่าน OAuth และให้มันสร้างที่เก็บ sync ส่วนตัวให้คุณ
  • อ่านแถบสถานะ sync และเข้าใจแต่ละสถานะใน sync state machine
  • ระบุเมื่อ OAuth ได้รีเฟรชอัตโนมัติในพื้นหลังและเมื่อคุณต้องอนุญาตใหม่ด้วยตนเอง
  • แก้ไขความขัดแย้ง sync เมื่อ note เดียวกันถูกแก้ไขในสองอุปกรณ์
  • ปรับแผงการตั้งค่า Sync (auto-sync, sync interval, sync on startup)
  • แก้ไขโหมดความล้มเหลวที่พบบ่อยที่สุด

ข้อกำหนดเบื้องต้น

ก่อนเริ่ม ให้แน่ใจว่าคุณมี:

  • บัญชี GitHub — ระดับฟรีก็ใช้ได้; คุณไม่ต้องการ GitHub Pro
  • สิทธิ์ sync ที่ใช้งาน — รวมอยู่กับระดับ BYOK Pro และ Sync Pro หากระดับการเรียกเก็บเงินของคุณไม่รวม sync หน้าจอการตั้งค่า Sync จะแสดงแบนเนอร์ "Subscribe to enable sync" ดู บทที่ 35: การสมัครสมาชิก & การเรียกเก็บเงิน สำหรับรายละเอียดแผน
  • Workspace ที่เปิดใน SeaMeet — sync แนบกับ workspace ที่ใช้งาน ไม่ใช่แอปทั้งหมด หากคุณมีหลาย workspaces แต่ละอันเป็นที่เก็บ GitHub ของตัวเอง
  • การเข้าถึงอินเทอร์เน็ตที่ใช้งาน — กระบวนการตั้งค่าเปิด GitHub ในเบราว์เซอร์เริ่มต้นของคุณ

หนึ่ง repo ต่อ workspace SeaMeet สร้างที่เก็บส่วนตัวแยกต่างหากสำหรับ workspace ที่คุณเชื่อมต่อแต่ละอัน สิ่งนี้ทำให้ work notes และ personal notes แยกจากกันอย่างสะอาด และหมายความว่าคุณสามารถตัดการเชื่อมต่อหนึ่งโดยไม่ต้องสัมผัสอีกตัวหนึ่ง


การตั้งค่าทีละขั้นตอน

การตั้งค่าครั้งแรกใช้เวลาประมาณ 90 วินาที: อนุญาต SeaMeet บน GitHub ให้มันสร้าง repo ของคุณ รอการอัปโหลดเริ่มต้น และคุณก็เสร็จ

ขั้นตอนที่ 1: เปิดการตั้งค่า Sync

  1. คลิกไอคอนเฟือง ตั้งค่า
  2. เปิดแท็บ Sync ใน rail ซ้าย
  3. คุณจะเห็นการ์ดหัวข้อ "Sync with GitHub"

หากคุณไม่เห็นแท็บ Sync ระดับการสมัครสมาชิกของคุณไม่รวม sync — ดูบทที่ 35 เพื่ออัปเกรด

หากคุณเห็นแบนเนอร์ที่อ่าน "Back up your notes to a private GitHub repo with BYOK Pro" คุณมีบัญชีฟรี คลิกแบนเนอร์เพื่อเปิด paywall หรือข้ามส่วนที่เหลือของบทนี้จนกว่าคุณจะสมัครสมาชิก

ขั้นตอนที่ 2: คลิก "Set Up GitHub Sync"

สถานะว่างของการตั้งค่า Sync แสดงสาม tiles ประโยชน์ ("Free & private", "Effectively unlimited", "One repo per workspace") และปุ่มหลัก Set Up GitHub Sync ที่ด้านล่าง

คลิกมัน เบราว์เซอร์เริ่มต้นของคุณเปิดไปยังหน้าการอนุญาต GitHub

ขั้นตอนที่ 3: ติดตั้ง SeaMeet GitHub App (ครั้งเดียว)

ครั้งแรกที่คุณอนุญาต SeaMeet GitHub จะขอให้คุณติดตั้ง SeaMeet GitHub App ในบัญชีของคุณ นี่เป็นขั้นตอนครั้งเดียวต่อบัญชี GitHub (หรือต่อองค์กร หากคุณต้องการ sync ไปยัง repo ที่องค์กรเป็นเจ้าของ)

ในหน้าการติดตั้ง GitHub:

  1. เลือก บัญชีหรือองค์กร ที่คุณต้องการให้ SeaMeet เขียนไป
  2. เลือก "All repositories" หรือ "Only select repositories" — SeaMeet App ต้องการสิทธิ์ contents: write และ administration: write เพื่อให้สามารถสร้าง sync repo แทนคุณ
  3. คลิก Install & Authorize

GitHub พาคุณกลับไปยัง SeaMeet แผงการตั้งค่า Sync ตอนนี้แสดง:

┌──────────────────────────────────────────────────────┐
│   ✓ อนุญาตแล้ว                                       │
│   ⟳ กำลังสร้างที่เก็บ & อัปโหลด...                   │
└──────────────────────────────────────────────────────┘

ทำไม GitHub App ไม่ใช่ token OAuth ธรรมดา? GitHub Apps มีสิทธิ์ที่ละเอียดต่อ repo และ refresh tokens ที่หมุน SeaMeet มีเพียงการเข้าถึงเขียนไปยัง repos ที่คุณเลือกอย่างชัดเจน และ token การเข้าถึง OAuth หมดอายุทุก 8 ชั่วโมง — แม้ว่ามันจะรั่วไหล หน้าต่างก็จะเล็ก (ดูส่วน OAuth Auto-Refresh ด้านล่างสำหรับวิธีที่ SeaMeet ทำให้สิ่งนั้นมองไม่เห็นสำหรับคุณ)

ขั้นตอนที่ 4: การสร้างที่เก็บ (อัตโนมัติ)

SeaMeet เรียก GitHub API แทนคุณและ:

  1. สร้าง repo ส่วนตัวที่ตั้งชื่อตาม workspace ของคุณ (เช่น seameet-work-notes)
  2. เริ่มต้น Git repo ในเครื่องภายในโฟลเดอร์ workspace ของคุณหากยังไม่มี
  3. รัน git init เขียน .gitignore ที่ยกเว้นไฟล์เสียง/วิดีโอ/ภาพหน้าจอ และทำ commit เริ่มต้น
  4. เพิ่ม GitHub repo ใหม่เป็น origin
  5. Push commit เริ่มต้น

คุณจะเห็นแถบสถานะที่ด้านล่างของ sidebar เปลี่ยนผ่าน:

กำลังสร้างที่เก็บ...  →  กำลังซิงค์...  →  ซิงค์แล้ว · เพิ่งเสร็จ

แค่นั้นเอง Workspace ของคุณตอนนี้ได้รับการสำรองข้อมูลโดย GitHub

ขั้นตอนที่ 5: การซิงค์ครั้งแรกทำงานโดยอัตโนมัติ

จากนี้ไป SeaMeet auto-commits ทุก 5 นาที (โดยค่าเริ่มต้น) เมื่อคุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก และ push ไปยัง GitHub ทันทีหลังจาก commit แต่ละครั้ง ในการเปิดตัว SeaMeet ครั้งต่อไป แอป pull จาก GitHub ก่อนที่คุณจะเริ่มแก้ไข — ดังนั้นการเปลี่ยนแปลงที่ทำในอุปกรณ์อื่นจะปรากฏในขณะที่แอปเปิด


Sync State Machine

SyncManager ของ SeaMeet รัน state machine ขนาดเล็กและออกอากาศสถานะปัจจุบันไปยัง renderer Sidebar SyncStatusBar และแผงการตั้งค่า Sync ต่างก็อ่านจากสถานะนี้ การเข้าใจสถานะช่วยให้คุณอ่าน UI ได้อย่างถูกต้อง

                      ┌─────────────┐
                      │    idle     │ ◄──────┐
                      └──────┬──────┘        │
                             │ การเปลี่ยนไฟล์│
                             ▼               │
                      ┌─────────────┐        │
                ┌────►│   pending   │        │
                │     └──────┬──────┘        │
       file     │            │ commit timer  │
       change   │            ▼               │
                │     ┌─────────────┐        │
                │     │ committing  │        │
                │     └──────┬──────┘        │
                │            ▼               │
                │     ┌─────────────┐        │
                │     │   pushing   │        │
                │     └──────┬──────┘        │
                │            ▼               │
                │     ┌─────────────┐        │
                │     │   synced    │── 5s ──┘
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   pulling   │  (เริ่มต้นหรือถูกปฏิเสธการ push)
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤  conflict   │  → ผู้ใช้แก้ไข → syncing → synced
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   offline   │  → เครือข่ายกลับมา → ลองอีกครั้ง
                │     └─────────────┘
                │
                │     ┌─────────────┐
                ├─────┤   timeout   │  → ผู้ใช้คลิก Retry
                │     └─────────────┘
                │
                │     ┌────────────────┐
                └─────┤ token-expired  │ → การ์ดอนุญาตใหม่
                      └────────────────┘

นี่คือความหมายของแต่ละสถานะใน UI:

สถานะป้ายแถบสถานะความหมาย
idle"ซิงค์แล้ว · 2 นาทีที่แล้ว"ไม่มีอะไรรอ commit ครั้งสุดท้ายสะอาด
pending"กำลังรอ..."คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก; commit timer จะเริ่มในช่วงเวลาถัดไป
committing"กำลังซิงค์..."Git commit อยู่ระหว่างการดำเนินการในเครื่อง
pushing"กำลัง push..."Commit ในเครื่องเสร็จสมบูรณ์; กำลัง push ไปยัง GitHub
pulling"กำลัง pull..."การซิงค์เริ่มต้น หรือ push ถูกปฏิเสธ และเรากำลัง pull ก่อน
syncing"กำลังซิงค์..."กำลังเสร็จสิ้น rebase หลังการแก้ไขความขัดแย้ง
synced"ซิงค์แล้ว · เพิ่งเสร็จ"ความสำเร็จเพิ่งเสร็จสมบูรณ์; แสดงเป็นเวลา 5 วินาที จากนั้นกลับสู่ idle
conflict"ความขัดแย้ง sync"ทั้งในเครื่องและ remote แก้ไขไฟล์เดียวกัน UI แสดงกระบวนการแก้ไขความขัดแย้ง
error"ข้อผิดพลาด sync"ความล้มเหลวที่ไม่ใช่เครือข่าย ไม่ใช่ความขัดแย้ง (เช่น git failure) ลองอัตโนมัติด้วย exponential backoff สูงสุด 5 ครั้ง
offline"ออฟไลน์"เครือข่ายไม่สามารถเข้าถึงได้ จะลองอีกครั้งในการเปลี่ยนไฟล์ครั้งถัดไปหรือหลังจาก 60 วินาที
timeout"การซิงค์หมดเวลา"คำสั่ง git ใช้เวลานานกว่า 60 วินาที (ดู Sync Timeout Protection ด้านล่าง)
token-expired"อนุญาตใหม่"การรีเฟรช OAuth ล้มเหลวและผู้ใช้ต้องอนุญาตใหม่ด้วยตนเอง
installing-app"กำลังติดตั้ง GitHub App..."กำลังรอให้ผู้ใช้เสร็จสิ้นขั้นตอนการติดตั้ง GitHub App ในเบราว์เซอร์ของพวกเขา
creating-repo"กำลังสร้างที่เก็บ..."กระบวนการตั้งค่ากำลังสร้าง GitHub repo และ push commit เริ่มต้น

หากแถบสถานะแสดง spinner นั่นเป็นกิจกรรมพื้นหลังปกติ หากเป็นสีเหลืองอำพันหรือสีแดง ดูส่วน การแก้ไขปัญหา ด้านล่าง


การรีเฟรช OAuth อัตโนมัติ

GitHub Apps ออก user access tokens ที่หมดอายุทุก 8 ชั่วโมง บวกกับ refresh token ที่ใช้ได้นาน 6 เดือน SeaMeet จัดการสิ่งนี้สำหรับคุณ ดังนั้นคุณแทบไม่ต้องคิดเกี่ยวกับมัน

วิธีการทำงาน:

  1. เมื่อ SeaMeet กำลังจะ push หรือ pull SyncManager._refreshTokenIfNeeded() ตรวจสอบว่า token ปัจจุบันหมดอายุภายใน 5 นาที ถัดไปหรือไม่
  2. หากใช่ SeaMeet เรียก endpoint /login/oauth/access_token ของ GitHub ด้วย refresh token ที่เก็บไว้ GitHub ส่งคืน access token ใหม่และหมุน refresh token SeaMeet เขียนทั้งสองกลับไปยังไฟล์ token ที่เข้ารหัสบนดิสก์
  3. คำสั่ง Git จากนั้นทำงานด้วย token ที่เพิ่งรีเฟรช คุณไม่เห็นอะไรบนหน้าจอ — การรีเฟรชทั้งหมดใช้เวลาน้อยกว่าหนึ่งวินาที

การจัดการความล้มเหลวชั่วคราว: หากการเรียกการรีเฟรชล้มเหลวเพราะเครือข่ายไม่เสถียรหรือ GitHub ส่งคืน 5xx (REFRESH_NETWORK_ERROR) SeaMeet จะไม่ ทิ้ง token ที่มีอยู่ แทนการซิงค์จะเข้าสู่สถานะ offline และลองอีกครั้งในภายหลัง สิ่งนี้สำคัญเพราะ token ที่มีอยู่อาจยังคงใช้ได้อีกหลายนาที — การทิ้งมันบนการสะดุดเครือข่ายชั่วคราวจะทำให้คุณออกจากระบบ sync โดยไม่จำเป็น

การรวมการรีเฟรชพร้อมกัน: GitHub หมุน refresh token ทุกครั้งที่คุณใช้ ดังนั้นการรีเฟรชพร้อมกันสองครั้งจะแข่งขันและหนึ่งจะทำให้อีกตัวไม่ถูกต้อง SeaMeet ยุบการเรียกการรีเฟรชพร้อมกันเป็น Promise เดียวที่กำลังบิน (_refreshPromise) ดังนั้นการซิงค์เริ่มต้นและ push-with-retry ไม่เคยต่อสู้กันบน token ที่กำลังหมุน

เมื่อการรีเฟรชล้มเหลวจริงๆ: หาก GitHub ส่งคืน REFRESH_TOKEN_EXPIRED — หมายความว่า refresh token 6 เดือนหมดอายุหรือถูกเพิกถอน — SeaMeet:

  1. ลบไฟล์ token ที่เข้ารหัสออกจากดิสก์
  2. เข้าสู่สถานะปลายทาง token-expired
  3. แสดงการ์ดสีเหลืองอำพันในการตั้งค่า Sync:
┌──────────────────────────────────────────────────────┐
│ ⚠  การอนุญาต GitHub หมดอายุ โปรด                     │
│    อนุญาตใหม่เพื่อดำเนินการซิงค์ต่อ                   │
│                                                       │
│  [ ↻ อนุญาต GitHub ใหม่ ]                             │
└──────────────────────────────────────────────────────┘

คลิก อนุญาต GitHub ใหม่ คุณจะถูกส่งกลับผ่านกระบวนการ OAuth — แต่เนื่องจาก GitHub App ได้รับการติดตั้งแล้ว มันคือการคลิกเดียวเพื่อยืนยันและคุณเสร็จในประมาณ 10 วินาที SeaMeet จากนั้นลบ token ที่ค้างจาก git config ในเครื่องของคุณ (token เก่าอาจฝังอยู่ใน URL ของ origin) ก่อนการ push ถัดไป ดังนั้นคุณจะไม่วนอยู่ใน credential ที่ตายแล้ว


การป้องกัน Sync Timeout

คำสั่ง Git อาจค้างตลอดไปหากเครือข่ายเงียบกลางคันการถ่ายโอน — TCP socket อาจอยู่ในสถานะเปิดครึ่งโดยไม่เคยเกิดข้อผิดพลาด SeaMeet ห่อหุ้มทุกการ push และ pull Git ใน timeout AbortController 60 วินาที

หาก push หรือ pull ไม่เสร็จใน 60 วินาที SeaMeet:

  1. ยกเลิก git subprocess
  2. เข้าสู่สถานะ timeout
  3. แสดงการ์ดสีเหลืองอำพันในการตั้งค่า Sync:
┌──────────────────────────────────────────────────────┐
│ ⚠  การซิงค์หมดเวลา อาจเกิดจากปัญหาเครือข่าย          │
│    หรือการอนุญาต GitHub หมดอายุ                       │
│                                                       │
│  [ ↻ ลองซิงค์อีกครั้ง ]   [ อนุญาต GitHub ใหม่ ]       │
└──────────────────────────────────────────────────────┘

ลองซิงค์อีกครั้ง รัน commitNow อีกครั้ง นี่คือปุ่มที่ถูกต้องที่จะคลิกหากคุณคิดว่าเครือข่ายของคุณเพิ่งหลุดสั้นๆ อนุญาต GitHub ใหม่ รัน OAuth flow อีกครั้ง; คลิกสิ่งนี้หาก timeout ยังคงเกิดขึ้นอย่างต่อเนื่อง ซึ่งมักจะหมายความว่า token ของคุณเป็นปัญหามากกว่าเครือข่าย

สถานะกลับสู่ idle โดยอัตโนมัติหลังจากประมาณ 30 วินาทีแม้ว่าคุณจะไม่คลิกอะไร — sync จะลองอีกครั้งในการเปลี่ยนไฟล์ครั้งถัดไป


การแก้ไขความขัดแย้ง

ความขัดแย้งเกิดขึ้นเมื่อ ไฟล์เดียวกัน ถูกแก้ไขในสองอุปกรณ์ตั้งแต่การ sync ครั้งล่าสุด ตัวอย่าง: คุณเขียนย่อหน้าใน meetings/2026-06-03-standup.md บนแล็ปท็อปของคุณ จากนั้นแก้ไขย่อหน้าเดียวกันบนเครื่องของเพื่อน เมื่ออุปกรณ์ที่สอง push GitHub ปฏิเสธการ push เพราะประวัติแยกออก

SeaMeet จัดการสิ่งนี้โดย:

  1. การ pull การเปลี่ยนแปลง remote ด้วย rebase
  2. การตรวจจับ markers ความขัดแย้งการ merge
  3. การเข้าสู่สถานะ conflict
  4. การแสดงความขัดแย้งในแถบสถานะ sidebar (ซึ่งจะคลิกได้) และในแผงความขัดแย้งการตั้งค่า Sync

Conflict Resolution Modal

การคลิกแถบสถานะเมื่อ sync อยู่ใน conflict เปิด Conflict Resolution Modal:

┌──────────────────────────────────────────────────────────┐
│  ⚠  ความขัดแย้ง Sync               1 / 2          [×]    │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  "2026-06-03-standup.md" ถูกเปลี่ยนแปลงในอุปกรณ์อื่น     │
│                                                          │
│  ┌────────────────────────┐  ┌────────────────────────┐  │
│  │ ✎  แก้ไขด้วยตนเอง      │  │ ✦  รวมโดย Agent        │  │
│  └────────────────────────┘  └────────────────────────┘  │
│                                                          │
└──────────────────────────────────────────────────────────┘

คุณมีสองตัวเลือก:

แก้ไขด้วยตนเอง — เปิดไฟล์ความขัดแย้งในตัวแก้ไขเริ่มต้นของระบบของคุณด้วย markers <<<<<<< / ======= / >>>>>>> มาตรฐานของ Git ในที่ แก้ไขไฟล์เพื่อแก้ไข บันทึก จากนั้นกลับไปที่ SeaMeet และคลิก Done SeaMeet จะ stage ไฟล์ที่แก้ไขแล้วและดำเนินการ rebase ต่อ

รวมโดย Agent (เฉพาะ BYOK Pro ต้องการ AI Agent ที่กำหนดค่า) — ส่งทั้งสองเวอร์ชันไปยัง AI Agent ที่กำหนดค่าของคุณ (GitHub Copilot หรือ Claude Code ดู บทที่ 36: คู่มือการตั้งค่า BYOK) และขอให้สร้างเวอร์ชันที่รวมที่เก็บความตั้งใจของทั้งสองด้าน เอาต์พุตของ agent ถูก stage โดยอัตโนมัติ; คุณจะเห็น spinner "กำลังเสร็จสิ้นการซิงค์..." ในขณะที่ rebase เสร็จสมบูรณ์

หากมีความขัดแย้งหลายอันพร้อมกัน modal แสดงตัวนับ (1 / 2, 2 / 2) และลูกศร chevron ในแผงความขัดแย้งการตั้งค่า Sync ดังนั้นคุณสามารถก้าวผ่านพวกเขาทีละอัน

"เก็บของฉัน" / "เก็บของพวกเขา" / "เก็บทั้งสอง" ตัวเลือกปรากฏเป็นตัวเลือกตามธรรมชาติเมื่อคุณอยู่ในตัวแก้ไขด้วยตนเอง: ทิ้งเฉพาะข้อความเวอร์ชันของคุณระหว่าง markers, เฉพาะข้อความเวอร์ชัน remote, หรือสลับทั้งสอง ปุ่ม Agent merge ทำ "เก็บทั้งสอง อย่างชาญฉลาด" อย่างมีประสิทธิภาพ

หากคุณทำผิดพลาด? ความขัดแย้ง Sync ไม่ทำลาย Git เก็บเนื้อหา "ของเรา" และ "ของพวกเขา" ดั้งเดิมใน index และ getConflictVersions(filePath) สามารถดึงข้อมูลใดก็ได้ที่จุดใดในระหว่างการแก้ไข คุณจะไม่สูญเสียงานโดยไม่ตั้งใจ


แผงการตั้งค่า Sync

เมื่อคุณเชื่อมต่อแล้ว การตั้งค่า Sync (ตั้งค่า → Sync) ให้หน้าจอเดียวที่มีทุกอย่างในที่เดียว:

┌─────────────────────────────────────────────────────────────┐
│  ✓ Sync & สำรองข้อมูล                                       │
│  Notes และ wiki ของคุณถูกซิงค์อัตโนมัติไปยัง GitHub         │
│  การบันทึกเสียง การบันทึกวิดีโอ และภาพหน้าจอ                │
│  ไม่ได้ซิงค์                                                │
├─────────────────────────────────────────────────────────────┤
│  ⓘ  https://github.com/you/seameet-work-notes                │
│  🕒 ซิงค์ครั้งสุดท้าย: 4 นาทีที่แล้ว                        │
├─────────────────────────────────────────────────────────────┤
│  ซิงค์อัตโนมัติ                                  [ เปิด  ◉ ] │
│  ช่วงเวลาซิงค์                                  [ 5 นาที ▾ ] │
│  Branch                                              main   │
│  ซิงค์ครั้งสุดท้าย                          4 นาทีที่แล้ว │
├─────────────────────────────────────────────────────────────┤
│  ซิงค์อัตโนมัติเมื่อเปลี่ยนแปลง                 [ เปิด  ◉ ] │
│  ซิงค์เมื่อเริ่มต้น                              [ เปิด  ◉ ] │
├─────────────────────────────────────────────────────────────┤
│  [ ⤓ ซิงค์ตอนนี้ ]                                          │
├─────────────────────────────────────────────────────────────┤
│  [ ↗ ดูบน GitHub ]    [ ตัดการเชื่อมต่อ ]                   │
└─────────────────────────────────────────────────────────────┘

ตัวควบคุม จากบนลงล่าง:

  • ซิงค์อัตโนมัติ — toggle หลักสำหรับ commit timer พื้นหลัง ปิดหมายความว่า SeaMeet commit เฉพาะเมื่อคุณคลิก ซิงค์ตอนนี้
  • ช่วงเวลาซิงค์ — commit timer เริ่มบ่อยแค่ไหน ตัวเลือกคือ 1 / 5 / 10 / 30 นาที ค่าเริ่มต้นคือ 5 นาที ช่วงเวลา 1 นาทีดีสำหรับการจดบันทึกอย่างกระตือรือร้น; 30 นาทีดีสำหรับ workspaces แก้ไขต่ำที่คุณต้องการ batch commits
  • Branch — Git branch ที่ SeaMeet ซิงค์ไปยัง เกือบจะเสมอเป็น main อ่านอย่างเดียวใน UI
  • ซิงค์ครั้งสุดท้าย — timestamp สัมพัทธ์ของ push ที่ประสบความสำเร็จล่าสุด
  • ซิงค์อัตโนมัติเมื่อเปลี่ยนแปลง — เมื่อเปิด การ pushes เกิดขึ้นทันทีหลังจาก commit ในเครื่องแต่ละครั้ง (กรณีทั่วไป) เมื่อปิด SeaMeet commit ในเครื่องแต่ push เฉพาะเมื่อคุณคลิก ซิงค์ตอนนี้ มีประโยชน์หากคุณต้องการ batch pushes (เช่น บนการเชื่อมต่อที่คิดค่า)
  • ซิงค์เมื่อเริ่มต้น — เมื่อเปิด SeaMeet pull จาก GitHub ในขณะที่แอปเปิดตัว แนะนำเว้นแต่คุณมีการเชื่อมต่อที่ช้ามาก
  • ซิงค์ตอนนี้ — บังคับ commit-and-push cycle ทันที ไม่รอ timer มีประโยชน์ก่อนปิดแล็ปท็อปของคุณ
  • ดูบน GitHub — เปิด repo ในเบราว์เซอร์ของคุณ
  • ตัดการเชื่อมต่อ — ล้าง token OAuth ที่เก็บไว้ ลบไฟล์ token ที่เข้ารหัส และลบ origin ออกจาก Git repo ในเครื่องของคุณ ไฟล์ Markdown ในเครื่องและประวัติ Git ของคุณไม่ถูกแตะ — มีเพียงลิงก์ไปยัง GitHub ที่ถูกตัด

สิ่งที่ถูกซิงค์ (และสิ่งที่ไม่)

นี่ถูกบันทึกในดัชนีส่วน แต่ควรพูดซ้ำที่นี่:

ซิงค์ไม่ซิงค์
Notes (ไฟล์ .md)บันทึกเสียง (.webm, .mp3)
หน้า Wiki (ไฟล์ .md)บันทึกวิดีโอ (.webm, .mp4)
Manifest การบันทึก (เมตาดาต้า JSON)ภาพหน้าจอ (.png, .jpg)
สรุป AI และบทถอดความการสร้าง AI ที่ cached
กราฟ Wikilinkการตั้งค่าแอป
.gitignoreสถานะ scratch ของตัวแก้ไข

.gitignore ที่ SeaMeet เขียนยกเว้นหมวดหมู่ไบนารีขนาดใหญ่ทั้งหมด สิ่งนี้ตั้งใจ: private repos ฟรีของ GitHub จำกัดที่ 1 GB และวิดีโอ 30 นาทีจะกินมันเพียงอย่างเดียว SeaMeet เก็บสื่อบนดิสก์ในเครื่องของคุณและซิงค์เฉพาะ Markdown น้ำหนักเบา

หากคุณต้องการการซิงค์สื่อเต็มรูปแบบ นั่นคือระดับ Sync Pro — ดูบทที่ 35


การแก้ไขปัญหา

"Authorization failed" ทันทีหลังจากคลิก Set Up GitHub Sync

สาเหตุและการแก้ไข:

  • Pop-up blocker — หากไม่มีหน้าต่างเบราว์เซอร์เปิดขึ้น OS หรือเบราว์เซอร์ของคุณอาจบล็อกการเปิดตัว คลิก Set Up GitHub Sync อีกครั้งและยืนยัน prompts pop-up ใดๆ
  • คุณปฏิเสธสิทธิ์ GitHub App — กลับไปผ่าน flow และยอมรับ scopes contents: write + administration: write หากไม่มี administration: write SeaMeet ไม่สามารถสร้าง repo ให้คุณได้
  • ข้อผิดพลาด state mismatch — ปิดหน้าต่าง SeaMeet อื่นๆ ที่อาจกำลังแข่งใน OAuth flow เดียวกัน จากนั้นลองอีกครั้ง

ข้อผิดพลาด "Repo permissions" ในระหว่างการตั้งค่า

ข้อผิดพลาดอ่านบางอย่างเช่น "GitHub App has 'contents: read' permission, but needs 'contents: write'." นี่หมายความว่าคุณติดตั้งเวอร์ชันเก่ากว่าของ App

แก้ไข:

  1. เปิด github.com/settings/installations
  2. ค้นหา SeaMeet ในรายการและคลิก Configure
  3. ใต้ Repository permissions เปลี่ยน Contents และ Administration เป็น Read and write
  4. บันทึก จากนั้น ถอนการติดตั้งและติดตั้งใหม่ แอป — GitHub จะใช้สิทธิ์ใหม่เฉพาะในการติดตั้งใหม่
  5. รัน Set Up GitHub Sync ใน SeaMeet อีกครั้ง

"Could not reach GitHub" / sync ค้างที่ "Offline"

ความล้มเหลวของเครือข่าย SeaMeet จะลองอีกครั้งโดยอัตโนมัติเมื่อ:

  • คุณทำการเปลี่ยนแปลงไฟล์ใดๆ (กระตุ้นความพยายามลองใหม่ทันที)
  • 60 วินาทีผ่านไปจากการลองครั้งล่าสุด

หากเครือข่ายของคุณกลับมาและ sync ยังคงแสดง Offline หลังจากผ่านไปไม่กี่นาที:

  1. คลิก ซิงค์ตอนนี้ เพื่อบังคับการลองอีกครั้ง
  2. หากนั่นหมดเวลา: ตรวจสอบว่า firewall ของคุณไม่บล็อก github.com
  3. เป็นที่พึ่งสุดท้าย เริ่ม SeaMeet ใหม่ — sync เริ่มต้นจะเริ่มในการเปิดตัว

Sync ค้างที่ "Pending"

มักหมายความว่า auto-commit timer ยังไม่เริ่ม โดยค่าเริ่มต้นมันเริ่มทุก 5 นาที ไม่ต้องการรอ? คลิก ซิงค์ตอนนี้

หาก ซิงค์ตอนนี้ ไม่ย้าย sync ผ่าน Pending ตรวจสอบ:

  • คุณอยู่ในระดับการเรียกเก็บเงินที่รวม sync หรือไม่? เปิดการตั้งค่า Sync — หากคุณเห็นแบนเนอร์ subscribe sync ถูกปิดในชั้นสิทธิ์
  • มีการเปลี่ยนแปลงที่ยังไม่ได้ commit นอกต้นไม้ Markdown หรือไม่? Auto-commit timer เริ่มเมื่อ _pendingChanges ไม่ว่างเปล่า

"ฉันเห็นการ์ด token-expired"

นี่คือจุดสิ้นสุดที่คาดไว้ของวงจรการรีเฟรช OAuth — refresh token 6 เดือนของคุณหมดอายุ หรือคุณเพิกถอน GitHub App หรือคุณเปลี่ยนรหัสผ่าน GitHub (ซึ่งทำให้ OAuth tokens ทั้งหมดไม่ถูกต้อง)

แก้ไข: คลิก อนุญาต GitHub ใหม่ ในการ์ด flow เหมือนกับการตั้งค่าเริ่มต้นแต่ข้ามขั้นตอนการติดตั้ง GitHub App (คุณมีการติดตั้งแล้ว) ใช้เวลาประมาณ 10 วินาที

แผงการแก้ไขความขัดแย้งไม่ปิด

แผงปิดเฉพาะเมื่อ ทั้งหมด ความขัดแย้งในรายการได้รับการแก้ไข หากคุณเห็นตัวนับ (1 / 3) ใช้ลูกศร chevron ในแผงความขัดแย้งการตั้งค่า Sync เพื่อก้าวผ่านไฟล์ที่เหลือ แต่ละไฟล์ต้องการการแก้ไขที่ชัดเจน (แก้ไขด้วยตนเอง + Done หรือ Agent merge)

หากแผงยืนยันว่ามีความขัดแย้งแต่คุณไม่เห็น markers ในไฟล์ของคุณ คลิก ซิงค์ตอนนี้ — สถานะ conflict ที่ค้างจะถูกล้างในการพยายามซิงค์ที่ประสบความสำเร็จครั้งถัดไป

วนซ้ำ "Push rejected"

หาก sync สลับระหว่าง pushing และ pulling ซ้ำๆ GitHub กำลังปฏิเสธ pushes ของคุณเพราะ remote ยังคงเคลื่อนไปข้างหน้า สิ่งนี้สามารถเกิดขึ้นได้หาก:

  • อินสแตนซ์ SeaMeet อื่นกำลังรันต่อ repo เดียวกันและ push เร็วกว่าตัวนี้ที่สามารถตามทัน — ปิดอินสแตนซ์อื่น
  • ใครบางคน (หรือเครื่องมือบางอย่าง) กำลัง commit ไปยัง GitHub repo จากภายนอก SeaMeet — หยุดเครื่องมือภายนอกชั่วคราวจนกว่าโคลนในเครื่องของคุณจะตามทัน

หมายเหตุความปลอดภัย

ที่ที่ token OAuth ถูกเก็บไว้: ใน OS keychain ของคุณผ่าน API safeStorage ของ Electron บน Windows นั่นคือ DPAPI, บน macOS เป็น Keychain Services, บน Linux เป็น libsecret blob ที่เข้ารหัสถูกเขียนไปยัง <userData>/github-token.enc ด้วยโหมดไฟล์ 0o600 ไฟล์เก็บ access token, refresh token, timestamp การหมดอายุ และ client ID, client secret และ slug ของ GitHub App

สิ่งที่ไม่ได้เก็บใน argv: OAuth token ไม่เคยถูกส่งเป็น argument -c http.extraHeader=... ไปยัง git เพราะ argv มองเห็นได้สำหรับผู้ใช้อื่นผ่าน ps aux แทน Authorization header ถูกแทรกผ่านตัวแปรสภาพแวดล้อม GIT_CONFIG_PARAMETERS ซึ่งเป็นส่วนตัวต่อโปรเซส ผู้ใช้อื่นบนเครื่องเดียวกันไม่สามารถเห็น token ของคุณ

สิ่งที่จบลงบนดิสก์ใน repo: ไฟล์ Markdown ธรรมดา ไม่มี tokens ไม่มี secrets ไม่มี credentials .gitignore ยกเว้นไฟล์สื่อ แต่คุณยังควรหลีกเลี่ยงการวาง secrets ลงในเนื้อหา notes — สิ่งเหล่านั้นจะซิงค์

การเพิกถอนการเข้าถึง: เพื่อตัดการเข้าถึงของ SeaMeet ไปยัง repo ทันที ถอนการติดตั้ง SeaMeet GitHub App ที่ github.com/settings/installations ความพยายามซิงค์ถัดไปจะล้มเหลวด้วย token-expired และ SeaMeet จะล้าง token ในเครื่องของมัน notes ในเครื่องของคุณไม่ถูกแตะ


การอ้างอิงด่วน

┌─────────────────────────────────────────────────────────────┐
│                   GITHUB SYNC                               │
│                   การอ้างอิงด่วน                            │
├─────────────────────────────────────────────────────────────┤
│  เปิดการตั้งค่า Sync   │ ตั้งค่า → Sync                     │
│  การตั้งค่าครั้งแรก    │ คลิก "Set Up GitHub Sync"          │
│  Scopes ที่จำเป็น      │ contents: write, admin: write      │
│  การตั้งชื่อ repo      │ หนึ่ง private repo ต่อ workspace   │
├─────────────────────────────────────────────────────────────┤
│  ช่วงเวลา sync เริ่มต้น│ 5 นาที (1 / 5 / 10 / 30)           │
│  บังคับ sync           │ ปุ่ม "ซิงค์ตอนนี้"                 │
│  Auto-sync บน push     │ เปิด (toggle ในการตั้งค่า Sync)    │
│  Sync เมื่อเริ่มต้น    │ เปิด (toggle ในการตั้งค่า Sync)    │
├─────────────────────────────────────────────────────────────┤
│  ขอบรีเฟรช OAuth       │ 5 นาทีก่อนหมดอายุ                  │
│  Timeout คำสั่ง Git    │ 60 วินาที (AbortController)        │
│  ขีดจำกัด auto-retry   │ 5 ครั้ง, exp. backoff              │
│  การเก็บ token         │ OS keychain (safeStorage)          │
├─────────────────────────────────────────────────────────────┤
│  UI ความขัดแย้ง        │ คลิกแถบสถานะเมื่อมีความขัดแย้ง     │
│  แก้ไขด้วยตนเอง        │ แก้ไข markers → Done               │
│  รวมโดย Agent          │ BYOK Pro + AI Agent กำหนดค่า       │
├─────────────────────────────────────────────────────────────┤
│  ตัดการเชื่อมต่อ       │ ตั้งค่า Sync → ตัดการเชื่อมต่อ      │
│  เพิกถอนจาก GitHub     │ github.com/settings/installations  │
│  ดู repo               │ ลิงก์ "ดูบน GitHub"                │
└─────────────────────────────────────────────────────────────┘

Last updated: 2026-06-04

บทที่ 37: ผู้ให้บริการ GitHub Copilot | (สิ้นสุดคู่มือ — กลับไปที่ ดัชนี)

Published: