راهاندازی GitHub Sync
فصل 38: راهاندازی GitHub Sync
GitHub Sync workspace SeaMeet شما را به یک درخت Markdown خصوصی و کنترلشده با نسخه تبدیل میکند که در مخزن GitHub خودتان زندگی میکند. هر بار که یک یادداشت را ویرایش میکنید، یک ضبط را تغییر عنوان میدهید یا یک صفحه ویکی را تنظیم میکنید، SeaMeet بیسر و صدا تغییر را در پسزمینه commit میکند و آن را به GitHub push میکند. SeaMeet را در یک لپتاپ متفاوت باز کنید و یادداشتهای شما در اولین راهاندازی pull میشوند — بدون Dropbox در وسط، بدون سرور Seasalt در حلقه. مخزن مال شماست، دادهها مال شماست، و اگر بخواهید میتوانید آن را مستقیماً در github.com مرور کنید.
مدل ساده است: مخزن GitHub شما ذخیره است. SeaMeet یک سرویس همگامسازی اجرا نمیکند. یک GitHub App کوچک را روی حساب شما نصب میکند، یک توکن OAuth per-user دریافت میکند، و از آن توکن برای push و pull commitهای Git مستقیم استفاده میکند. زیرا ذخیره سطح رایگان GitHub است — که به شما مخازن خصوصی نامحدود میدهد — همگامسازی به طور مؤثر رایگان است. و چون هر workspace SeaMeet مخزن خود است، میتوانید workspaceهای کار و شخصی را به طور کامل جدا نگه دارید.
اهداف فصل
پس از خواندن این فصل، قادر خواهید بود:
- SeaMeet GitHub App را روی حساب یا سازمان خود نصب کنید
- SeaMeet را از طریق OAuth مجاز کنید و به آن اجازه دهید یک مخزن همگامسازی خصوصی برای شما ایجاد کند
- نوار وضعیت همگامسازی را بخوانید و هر حالت در ماشین حالت همگامسازی را درک کنید
- تشخیص دهید چه زمانی OAuth در پسزمینه به طور خودکار رفرش شده است و چه زمانی نیاز به مجوز دستی دارید
- یک تعارض همگامسازی را زمانی که همان یادداشت روی دو دستگاه ویرایش شده است حل کنید
- پنل Sync Settings را تنظیم کنید (همگامسازی خودکار، فاصله همگامسازی، همگامسازی در راهاندازی)
- رایجترین حالتهای شکست را عیبیابی کنید
پیشنیازها
قبل از شروع، مطمئن شوید که دارید:
- یک حساب GitHub — سطح رایگان مناسب است؛ به GitHub Pro نیاز ندارید
- یک حق همگامسازی فعال — با سطوح BYOK Pro و Sync Pro همراه است. اگر سطح صورتحساب شما شامل همگامسازی نیست، صفحه Sync Settings یک بنر "Subscribe to enable sync" نشان میدهد. برای جزئیات طرح به فصل 35: اشتراک و صورتحساب مراجعه کنید.
- یک workspace باز در SeaMeet — همگامسازی به workspace فعال متصل میشود، نه به برنامه به طور کلی. اگر چندین workspace دارید، هر یک مخزن GitHub خود است.
- دسترسی اینترنت کارا — جریان راهاندازی GitHub را در مرورگر پیشفرض شما باز میکند
یک مخزن به ازای ه ر workspace. SeaMeet برای هر workspace که متصل میکنید یک مخزن خصوصی جداگانه ایجاد میکند. این یادداشتهای کار و یادداشتهای شخصی را به طور تمیز ایزوله نگه میدارد و به این معنی است که میتوانید یکی را بدون لمس دیگری قطع کنید.
راهاندازی گام به گام
راهاندازی اولیه حدود 90 ثانیه طول میکشد: SeaMeet را در GitHub مجاز کنید، اجازه دهید مخزن شما را ایجاد کند، منتظر آپلود اولیه باشید، و کار شما تمام است.
مرحله 1: باز کردن Sync Settings
- روی آیکون چرخدنده Settings کلیک کنید
- تب Sync را در ریل چپ باز کنید
- کارت سرنوشت "Sync with GitHub" را خواهید دید
اگر تب Sync را نمیبینید، سطح اشتراک شما شامل همگامسازی نیست — برای ارتقا به فصل 35 مراجعه کنید.
اگر یک بنر میبینید که میخواند "Back up your notes to a private GitHub repo with BYOK Pro"، یک حساب رایگان دارید. روی بنر کلیک کنید تا paywall را باز کنید، یا بقیه این فصل را تا زمانی که مشترک شدهاید رد کنید.
مرحله 2: روی "Set Up GitHub Sync" کلیک کنید
حالت خالی Sync Settings سه کاشی مزیت ("Free & private"، "Effectively unlimited"، "One repo per workspace") و یک دکمه اصلی Set Up GitHub Sync در پایین را نشان میدهد.
روی آن کلیک کنید. مرورگر پیشفرض شما به یک صفحه مجوز GitHub باز میشود.
مرحله 3: نصب SeaMeet GitHub App (یک بار)
اولین بار که SeaMeet را مجاز میکنید، GitHub از شما میخواهد SeaMeet GitHub App را روی حساب خود نصب کنید. این یک مرحله یک بار به ازای هر حساب GitHub است (یا به ازای هر سازمان، اگر میخواهید با یک مخزن متعلق به سازمان همگام شوید).
در صفحه نصب GitHub:
- حساب یا سازمانی که میخواهید SeaMeet به آن بنویسد را انتخاب کنید
- یا "All repositories" یا "Only select repositories" را انتخا ب کنید — SeaMeet App به مجوزهای
contents: writeوadministration: writeنیاز دارد تا بتواند مخزن همگامسازی را از طرف شما ایجاد کند - روی Install & Authorize کلیک کنید
GitHub شما را به SeaMeet بازمیگرداند. پنل Sync Settings اکنون نشان میدهد:
┌──────────────────────────────────────────────────────┐
│ ✓ مجاز │
│ ⟳ ایجاد مخزن و آپلود... │
└──────────────────────────────────────────────────────┘
چرا یک GitHub App و نه یک توکن OAuth ساده؟ GitHub Appها مجوزهای ریزدانه به ازای هر مخزن و توکنهای رفرش چرخشی دارند. SeaMeet فقط به مخازنی که شما به طور صریح انتخاب کردهاید دسترسی نوشتن دارد، و توکن دسترسی OAuth هر 8 ساعت منقضی میشود — حتی اگر نشت کند، پنجره کوچک خواهد بود. (برای نحوه نگه داشتن آن نامرئی برای شما توسط SeaMeet به بخش OAuth Auto-Refresh در زیر مراجعه کنید.)
مرحله 4: ایجاد مخزن (خودکار)
SeaMeet اکنون API GitHub را از طرف شما فراخوانی میکند و:
- یک مخزن خصوصی با نام workspace شما ایجاد میکند (مثل
seameet-work-notes) - یک مخزن Git محلی را در داخل پوشه workspace شما مقداردهی اولیه میکند اگر یکی از قبل وجود نداشته باشد
git initرا اجرا میکند، یک.gitignoreمینویسد که فایلهای صوتی/ویدیویی/تصویر لحظهای را حذف میکند، و یک commit اولیه ایجاد میکند- مخزن جدید GitHub را به عنوان
originاضافه میکند - commit اولیه را push میکند
نوار وضعیت در پایین نوار کناری را خواهید دید که از طریق:
ایجاد مخزن... → در حال همگامسازی... → همگام شد · همین الان
عبور میکند. این تمام است. workspace شما اکنون توسط GitHub پشتیبانی میشود.
مرحله 5: اولین همگامسازی به طور خودکار اجرا میشود
از اکنون به بعد، SeaMeet هر 5 دقیقه (به طور پیشفرض) به طور خودکار commit میکند هر زمان تغییرات ذخیره نشده دارید، و بلافاصله پس از هر commit به GitHub push میکند. در راهاندازی بعدی SeaMeet، برنامه قبل از اینکه حتی شروع به ویرایش کنید از GitHub pull میکند — بنابراین تغییرات روی دستگاه دیگر در لحظه باز شدن برنامه ظاهر میشوند.
ماشین حالت همگامسازی
SyncManager SeaMeet یک ماشین حالت کوچک اجرا میکند و حالت فعلی خود را به renderer پخش میکند. هم SyncStatusBar نوار کناری و هم پنل Sync Settings از این حالت میخوانند. درک حالتها به شما کمک میکند UI را به طور دقیق بخوانید.
┌─────────────┐
│ idle │ ◄──────┐
└──────┬──────┘ │
│ تغییر فایل │
▼ │
┌─────────────┐ │
┌────►│ pending │ │
│ └──────┬──────┘ │
تغییر │ │ تایمر commit │
فایل │ ▼ │
│ ┌─────────────┐ │
│ │ committing │ │
│ └──────┬──────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ pushing │ │
│ └──────┬──────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ synced │── 5s ──┘
│ └─────────────┘
│
│ ┌─────────────┐
├─────┤ pulling │ (راهاندازی یا push-rejected)
│ └─────────────┘
│
│ ┌─────────────┐
├─────┤ conflict │ → کاربر حل میکند → syncing → synced
│ └─────────────┘
│
│ ┌─────────────┐
├─────┤ offline │ → شبکه بازگشت → تلاش مجدد
│ └─────────────┘
│
│ ┌─────────────┐
├─────┤ timeout │ → کاربر روی Retry کلیک میکند
│ └─────────────┘
│
│ ┌────────────────┐
└─────┤ token-expired │ → کارت مجوز مجدد
└────────────────┘
اینجا آنچه هر حالت در UI به معنی است:
| حالت | برچسب نوار وضعیت | چه چیزی به معنی است |
|---|---|---|
| idle | "همگام شد · 2 دقیقه پیش" | هیچ چیز معلق نیست، آخرین commit تمیز بود |
| pending | "معلق..." | تغییرات ذخیره نشده دارید؛ تایمر commit در فاصله بعدی شلیک میشود |
| committing | "در حال همگامسازی..." | یک commit Git به طور محلی در حال انجام است |
| pushing | "در حال push..." | commit محلی کامل؛ push به GitHub |
| pulling | "در حال pull..." | یا همگامسازی راهاندازی، یا push رد شد و ما ابتدا pull میکنیم |
| syncing | "در حال همگامسازی..." | اتمام یک rebase پس از حل تعارض |
| synced | "همگام شد · همین الان" | موفقیت تازه تکمیل شده؛ به مدت 5 ثانیه نشان داده میشود، سپس به idle برمیگردد |
| conflict | "تعارض همگامسازی" | محلی و راه دور هر دو همان فایل را ویرای ش کردند. UI جریان حل تعارض را پدیدار میکند. |
| error | "خطای همگامسازی" | یک شکست غیر شبکهای، غیر تعارض (مثل شکست git). با backoff نمایی تا 5 بار به طور خودکار تلاش مجدد میکند. |
| offline | "آفلاین" | شبکه قابل دسترسی نیست. در تغییر فایل بعدی یا پس از 60 ثانیه تلاش مجدد میکند. |
| timeout | "همگامسازی timeout شد" | یک دستور git بیش از 60 ثانیه طول کشید (به Sync Timeout Protection در زیر مراجعه کنید) |
| token-expired | "مجوز مجدد" | رفرش OAuth شکست خورد و کاربر باید به طور دستی مجدداً مجاز کند |
| installing-app | "در حال نصب GitHub App..." | منتظر کاربر برای اتمام مرحله نصب GitHub App در مرورگر خود |
| creating-repo | "در حال ایجاد مخزن..." | جریان راهاندازی در حال ایجاد مخزن GitHub و push کردن commit اولیه است |
اگر نوار وضعیت یک spinner را نشان میدهد، این فعالیت پسزمینه طبیعی است. اگر کهربایی یا قرمز است، بخش عیبیابی در زیر را ببینید.
OAuth Auto-Refresh
GitHub Appها توکنهای دسترسی کاربر را که هر 8 ساعت منقضی میشوند، به علاوه یک توکن رفرش که 6 ماه معتبر است، صادر میکنند. SeaMeet این را برای شما مدیریت میکند بنابراین تقریباً هرگز نیازی به فکر کردن در مورد آن ندارید.
چگونه کار میکند:
- وقتی SeaMeet در شرف push یا pull است،
SyncManager._refreshTokenIfNeeded()بررسی میکند آیا توکن فعلی در 5 دقیقه آینده منقضی میشود. - اگر بله، SeaMeet endpoint
/login/oauth/access_tokenGitHub را با توکن رفرش ذخیره شده فراخوانی میکند. GitHub یک توکن دسترسی جدید برمیگرداند و توکن رفرش را میچرخاند. SeaMeet هر دو را به فایل توکن رمزگذاری شده روی دی سک مینویسد. - سپس دستور Git با توکن تازهرفرش شده اجرا میشود. شما چیزی روی صفحه نمیبینید — کل رفرش به خوبی زیر یک ثانیه طول میکشد.
رسیدگی به شکست گذرا: اگر تماس رفرش به دلیل ناپایداری شبکه شکست بخورد یا GitHub یک 5xx بازگرداند (یک REFRESH_NETWORK_ERROR)، SeaMeet توکن موجود را دور نمیاندازد. در عوض همگامسازی به حالت offline میرود و بعداً دوباره تلاش میکند. این مهم است زیرا توکن موجود ممکن است هنوز برای چند دقیقه دیگر معتبر باشد — دور انداختن آن در یک blip شبکه گذرا غیرضروری شما را از همگامسازی خارج میکند.
ادغام رفرش همزمان: GitHub توکن رفرش را هر بار که از آن استفاده میکنید میچرخاند، بنابراین دو رفرش همزمان رقابت میکنند و یکی دیگر را باطل میکند. SeaMeet تماسهای رفرش همزمان را به یک Promise در حال پرواز واحد (_refreshPromise) سقوط میدهد بنابراین همگامسازی راهاندازی و push-with-retry هرگز بر سر توکن چرخشی نمیجنگند.
وقتی رفرش واقعاً شکست میخورد: اگر GitHub REFRESH_TOKEN_EXPIRED برگرداند — به این معنی که توکن رفرش 6 ماهه منقضی شده یا لغو شده است — SeaMeet:
- فایل توکن رمزگذاری شده را از دیسک حذف میکند
- به حالت پایانه
token-expiredوارد میشود - یک کارت کهربایی در Sync Settings نشان میدهد:
┌──────────────────────────────────────────────────────┐
│ ⚠ مجوز GitHub منقضی شده است. لطفاً │
│ برای از سرگیری همگامسازی مجدداً مجاز کنید. │
│ │
│ [ ↻ مجوز مجدد GitHub ] │
└──────────────────────────────────────────────────────┘
روی مجوز مجدد GitHub کلیک کنید. شما به جریان OAuth بازگردانده میشوید — اما زیرا GitHub App قبلاً نصب شده است، یک کلیک برای تأیید است و در حدود 10 ثانیه تمام شده است. SeaMeet سپس هر توکن قدیمی را از git config محلی شما (توکن قدیمی ممکن است در URL origin تعبیه شده باشد) قبل از push بعدی میکشد، بنابراین در یک اعتبار مرده حلقه نمیزنید.
محافظت از Sync Timeout
دستورات Git میتوانند برای همیشه آویزان شوند اگر یک شبکه در میانه انتقال ساکت شود — یک سوکت TCP ممکن است در یک حالت نیمهباز بدون هرگز ایجاد خطا بنشیند. SeaMeet هر push و pull Git را در یک timeout 60 ثانیهای AbortController قرار میدهد.
اگر یک push یا pull در 60 ثانیه کامل نشود، SeaMeet:
- زیرفرآیند git را لغو میکند
- به حالت
timeoutوارد میشود - یک کارت کهربایی در Sync Settings نشان میدهد:
┌──────────────────────────────────────────────────────┐
│ ⚠ همگامسازی timeout شد. این ممکن است ناشی از یک مشکل │
│ شبکه یا مجوز GitHub منقضی شده باشد. │
│ │
│ [ ↻ تلاش مجدد همگامسازی ] [ مجوز مجدد GitHub ] │
└──────────────────────────────────────────────────────┘
تلاش مجدد همگامسازی commitNow را دوباره اجرا میکند. این دکمه درست برای کلیک کردن است اگر فکر میکنید شبکه شما فقط مختصراً قطع شده است. مجوز مجدد GitHub جریان OAuth را دوباره اجرا میکند؛ اگر timeout مدام تکرار میشود، که معمولاً به این معنی است که توکن شما مشکل است نه شبکه، روی این کلیک کنید.
وضعیت پس از حدود 30 ثانیه به طور خودکار به idle برمیگردد حتی اگر روی هیچ چیز کلیک نکنید — همگامسازی در تغییر فایل بعدی تلاش مجدد خواهد کرد.
حل تعارض
یک تعارض زمانی اتفاق میافتد که همان فایل روی دو دستگاه از آخرین همگامسازی ویرایش شده است. مثال: شما یک پاراگراف در meetings/2026-06-03-standup.md روی لپتاپ خود نوشتید، سپس بعداً همان پاراگراف را روی دستگاه دوست خود ویرایش کردید. وقتی دستگاه دوم push میکند، GitHub push را رد میکند زیرا تاریخچهها واگرا هستند.
SeaMeet این را با:
- pull تغییرات راه دور با rebase
- تشخیص علامتهای تعارض ادغام
- ورود به حالت
conflict - پدیدار کردن تعارض در نوار وضعیت نوار کناری (که قابل کلیک میشود) و در پنل تعارض Sync Settings
اداره میکند.
مدال حل تعارض
کلیک بر روی نوار وضعیت زمانی که همگامسازی در conflict است، مدال حل تعارض را باز میکند:
┌──────────────────────────────────────────────────────────┐
│ ⚠ تعارض همگامسازی 1 / 2 [×] │
├──────────────────────────────────────────────────────────┤
│ │
│ "2026-06-03-standup.md" روی یک دستگاه دیگر تغییر کرد. │
│ │
│ ┌────────────────────────┐ ┌────────────────────────┐ │
│ │ ✎ ویرایش دستی │ │ ✦ ادغام Agent │ │
│ └────────────────────────┘ └───────────── ───────────┘ │
│ │
└──────────────────────────────────────────────────────────┘
دو گزینه دارید:
ویرایش دستی — فایل تعارض را در ویرایشگر پیشفرض سیستم شما با علامتهای استاندارد Git <<<<<<< / ======= / >>>>>>> در محل باز میکند. فایل را برای حل آنها ویرایش کنید، ذخیره کنید، سپس به SeaMeet برگردید و روی Done کلیک کنید. SeaMeet فایل حل شده را stage میکند و rebase را ادامه میدهد.
ادغام Agent (فقط BYOK Pro، نیاز به AI Agent پیکربندی شده دارد) — هر دو نسخه را به AI Agent پیکربندی شده شما (GitHub Copilot یا Claude Code، به فصل 36: راهنمای راهاندازی BYOK مراجعه کنید) ارسال میکند و از آن میخواهد یک نسخه ادغام شده تولید کند که هدف هر دو طرف را حفظ کند. خروجی agent به طور خودکار stage میشود؛ یک spinner "Finishing sync..." در حالی که rebase کامل میشود خواهید دید.
اگر چندین تعارض همزمان وجود دارد، مدال یک شمارنده (1 / 2، 2 / 2) و فلشهای chevron در پنل تعارض Sync Settings نشان میدهد تا بتوانید آنها را یکی یکی طی کنید.
گزینههای "Keep mine" / "Keep theirs" / "Keep both" به عنوان انتخابهای طبیعی زمانی که در داخل ویرایشگر دستی هستید پیش میآیند: فقط متن نسخه خود را بین علامتها بگذارید، فقط متن نسخه راه دور را، یا هر دو را در هم بیامیزید. دکمه ادغام Agent به طور مؤثر "هر دو را به طور هوشمندانه نگه دارید" را انجام میدهد.
اگر اشتباه کنید چه میشود؟ تعارضات همگامسازی غیرمخرب هستند. Git محتوای اصلی "ours" و "theirs" را در فهرست نگه میدارد، و
getConflictVersions(filePath)میتواند هر یک از آنها را در هر نقطه در طول حل بازیابی کند. شما به طور تصادفی کار را از دست نخواهید داد.
پنل Sync Settings
پس از اتصال، Sync Settings (تنظیمات → Sync) همه چیز را در یک صفحه به شما میدهد:
┌─────────────────────────────────────────────────────────────┐
│ ✓ همگامسازی و پشتیبان │
│ یادداشتها و ویکی شما به طور خودکار با GitHub همگام میشوند. │
│ ضبطهای صوتی، ضبطهای ویدئویی و تصاویر لحظهای │
│ همگام نمیشوند. │
├─────────────────────────────────────────────────────────────┤
│ ⓘ https://github.com/you/seameet-work-notes │
│ 🕒 آخرین همگامسازی: 4 دقیقه پیش │
├─────────────────────────────────────────────────────────────┤
│ همگامسازی خودکار [ روشن ◉ ] │
│ فاصله همگامسازی [ 5 دقیقه ▾ ] │
│ Branch main │
│ آخرین همگامشده 4 دقیقه پیش │
├─────────────────────────────────────────────────────────────┤
│ همگامسازی خودکار در تغییرات [ روشن ◉ ] │
│ همگامسازی در راهاندازی [ روشن ◉ ] │
├─────────────────────────────────────────────────────────────┤
│ [ ⤓ همگامسازی اکنون ] │
├─────────────────────────────────────────────────────────────┤
│ [ ↗ مشاهده در GitHub ] [ قطع اتصال ] │
└─────────────────────────────────────────────────────────────┘
کنترلها، از بالا به پایین:
- همگامسازی خودکار — تغییر وضعیت اصلی برای تایمر commit پسزمینه. خاموش به این معنی است که SeaMeet فقط زمانی commit میکند که روی همگامسازی اکنون کلیک میکنید.
- فاصله همگامسازی — تایمر commit چند بار شلیک میشود. انتخابها 1 / 5 / 10 / 30 دقیقه هستند. پیشفرض 5 دقیقه است. یک فاصله 1 دقیقهای برای یادداشتبرداری فعال خوب است؛ 30 دقیقه برای workspaceهای کمویرایش خوب است که ترجیح میدهید commitها را دستهبندی کنید.
- Branch — branch Git که SeaMeet با آن همگام میشود. تقریباً همیشه
main. در UI فقط خواندنی است. - آخرین همگامشده — مهر زمانی نسبی آخرین push موفق.
- همگامسازی خودکار در تغییرات — وقتی روشن است، pushها بلافاصله پس از هر commit محلی اتفاق میافتند (مورد معمول). وقتی خاموش است، SeaMeet به طور محلی commit میکند اما فقط زمانی push میکند که روی همگامسازی اکنون کلیک میکنید. مفید اگر میخواهید pushها را دستهبندی کنید (مثلاً روی یک اتصال اندازهگیری شده).
- همگامسازی در راهاندازی — وقتی روشن است، SeaMeet در لحظه راهاندازی برنامه از GitHub pull میکند. توصیه میشود مگر اینکه اتصال بسیار کندی داشته باشید.
- همگامسازی اکنون — یک چرخه commit-and-push فوری را اجبار کنید. منتظر تایمر نمیماند. مفید قبل از بستن لپتاپ خود.
- مشاهده در GitHub — مخزن را در مرورگر شما باز میکند.
- قطع اتصال — توکن OAuth ذخیره شده را پاک میکند، فایل توکن رمزگذاری شده را حذف میکند، و
originرا از مخزن Git محلی شما حذف میکند. فایلهای Markdown محلی و تاریخچه Git شما دستنخورده باقی میمانند — فقط پیوند به GitHub قطع میشود.
چه چیزی همگام میشود (و چه چیزی نه)
این در فهرست بخش مستند شده است، اما ارزش تکرار اینجا را دارد:
| همگام شده | همگام نشده |
|---|---|
یادداشتها (فایلهای .md) | ضبطهای صوتی (.webm، .mp3) |
صفحات ویکی (فایلهای .md) | ضبطهای ویدئویی (.webm، .mp4) |
| مانیفستهای ضبط (JSON فراداده) | تصاویر لحظهای (.png، .jpg) |
| خلاصههای AI و متنها | تولیدهای AI کش شده |
| نمودار Wikilink | تنظیمات برنامه |
.gitignore | حالت scratch ویرایشگر |
.gitignore که SeaMeet مینویسد همه دستههای باینری بزرگ را حذف میکند. این عمدی است: مخازن خصوصی رایگان GitHub در 1 GB محدود میشوند، و یک ویدیوی 30 دقیقهای آن را به تنهایی میخورد. SeaMeet رسانه را روی دیسک محلی شما نگه میدارد و فقط Markdown سبک را همگام میکند.
اگر میخواهید همگامسازی کامل رسانه، این سطح Sync Pro است — فصل 35 را ببینید.
عیبیابی
"مجوز شکست خورد" درست پس از کلیک بر روی Set Up GitHub Sync
علل و رفعها:
- مسدودکننده پاپآپ — اگر هیچ پنجره مرورگری باز نشد، سیستمعامل یا مرورگر شما ممکن است راهاندازی را مسدود کرده باشد. روی Set Up GitHub Sync دوباره کلیک کنید و هر prompt پاپآپ را تأیید کنید.
- شما مجوزهای GitHub App را رد کردید — به جریان برگردید و scopeهای
contents: write+administration: writeرا بپذیرید. بدونadministration: writeSeaMeet نمیتواند مخزن را برای شما ایجاد کند. - خطای عدم تطابق حالت — هر پنجره دیگر SeaMeet را که ممکن است در همان جریان OAuth مسابقه دهند ببندید، سپس دوباره امتحان کنید.
خطای "مجوزهای مخزن" در حین راهاندازی
خطا چیزی شبیه به این میخواند "GitHub App has 'contents: read' permission, but needs 'contents: write'." این به این معنی است که یک نسخه قدیمیتر از App را نصب کردهاید.
رفع:
- github.com/settings/installations را باز کنید
- SeaMeet را در لیست پیدا کنید و روی Configure کلیک کنید
- تحت مجوزهای مخزن، Contents و Administration را به Read and write تغییر دهید
- ذخیره کنید، سپس حذف و نصب مجدد برنامه — GitHub فقط مجوزهای جدید را در نصب مجدد اعمال میکند
- Set Up GitHub Sync را در SeaMeet دوباره اجرا کنید
"نتوانست به GitHub دسترسی پیدا کند" / همگامسازی روی "آفلاین" گیر کرده است
شکست شبکه. SeaMeet به طور خودکار تلاش مجدد خواهد کرد وقتی:
- شما هر تغییر فایلی ایجاد کنید (یک تلاش مجدد فوری را تحریک میکند)
- 60 ثانیه از آخرین تلاش مجدد بگذرد
اگر شبکه شما بازگشته است و همگامسازی پس از چند دقیقه هنوز آفلاین را نشان میدهد:
- روی همگامسازی اکنون کلیک کنید تا یک تلاش مجدد را اجبار کنید
- اگر آن timeout شد: بررسی کنید firewall شما github.com را مسدود نمیکند
- به عنوان آخرین راهحل، SeaMeet را راهاندازی مجدد کنید — همگامسازی راهاندازی در راهاندازی شلیک میشود
همگامسازی روی "معلق" گیر کرده است
این معمولاً به این معنی است که تایمر commit خودکار هنوز شلیک نکرده است. به طور پیشفرض هر 5 دقیقه شلیک میشود. نمیخواهید منتظر بمانید؟ روی همگامسازی اکنون کلیک کنید.
اگر همگامسازی اکنون همگامسازی را از Pending عبور نمیدهد، بررسی کنید:
- آیا شما در سطح صورتحساب هستید که شامل همگامسازی است؟ Sync Settings را باز کنید — اگر بنر اشتراک میبینید، همگامسازی در لایه حق غیرفعال است.
- آیا تغییرات commit نشدهای خارج از درخت Markdown وجود دارد؟ تایمر commit خودکار فقط زمانی شلیک میشود که
_pendingChangesغیرخالی است.
"من کارت token-expired را میبینم"
این پایان مورد انتظار چرخه عمر رفرش OAuth است — توکن رفرش 6 ماهه شما منقضی شد، یا GitHub App را لغو کردید، یا رمز عبور GitHub خود را تغییر دادید (که همه توکنهای OAuth را باطل میکند).
رفع: روی مجوز مجدد GitHub در کارت کلیک کنید. جریان مانند راهاندازی اولیه است اما مرحله نصب GitHub App را رد میکند (شما قبلاً آن را نصب کردهاید). حدود 10 ثانیه طول میکشد.
پنل حل تعارض بسته نمیشود
پنل فقط زمانی بسته میشود که همه تعارضات در لیست حل شوند. اگر شمارنده (1 / 3) را میبینید، از فلشهای chevron در پنل تعارض Sync Settings برای طی کردن فایلهای باقیمانده استفاده کنید. هر یک به یک حل صریح نیاز دارد (ویرایش دستی + Done، یا ادغام Agent).
اگر پنل اصرار دارد که تعارضاتی وجود دارد اما هیچ علامتی در فایلهای خود نمیبینید، روی همگامسازی اکنون کلیک کنید — یک حالت conflict قدیمی در تلاش همگامسازی موفق بعدی پاک میشود.
حلقههای "Push رد شد"
اگر همگامسازی به طور مکرر بین pushing و pulling متناوب میشود، GitHub pushهای شما را رد میکند زیرا راه دور همچنان جلو میرود. این میتواند اتفاق بیفتد اگر:
- یک نمونه دیگر SeaMeet در برابر همان مخزن در حال اجرا و push کردن سریعتر از این یکی برای رسیدن — نمونه دیگر را ببندید.
- کسی (یا یک ابزار) از خارج از SeaMeet به مخزن GitHub commit میکند — ابزار خارجی را متوقف کنید تا clone محلی شما برسد.
یادداشتهای امنیتی
کجا توکن OAuth ذخیره میشود: در keychain سیستمعامل شما از طریق API safeStorage Electron. در Windows این DPAPI است، در macOS این Keychain Services است، در Linux این libsecret است. blob رمزگذاری شده به <userData>/github-token.enc با حالت فایل 0o600 نوشته میشود. فایل توکن دسترسی، توکن رفرش، مهر زمانی انقضا، و client ID، client secret و slug GitHub App را نگه میدارد.
چه چیزی در argv ذخیره نمیشود: توکن OAuth هرگز به عنوان یک آرگومان -c http.extraHeader=... به git ارسال نمیشود، زیرا argv برای کاربران دیگر از طریق ps aux قابل مشاهده است. در عوض هدر Authorization از طریق متغیر محیطی GIT_CONFIG_PARAMETERS تزریق میشود، که برای فرآیند خصوصی است. کاربران دیگر روی همان دستگاه نمیتوانند توکن شما را ببینند.
چه چیزی در مخزن روی دیسک ختم میشود: فایلهای Markdown ساده. بدون توکن، بدون اسرار، بدون اعتبارنامه. .gitignore فایلهای رسانه را حذف میکند، اما هنوز باید از paste کردن اسرار در بدنه یادداشت اجتناب کنید — آنها همگام خواهند شد.
لغو دسترسی: برای قطع فوری دسترسی SeaMeet به یک مخزن، SeaMeet GitHub App را در github.com/settings/installations حذف کنید. تلاش همگامسازی بعدی با token-expired شکست میخورد و SeaMeet توکن محلی خود را پاک میکند. یادداشتهای محلی شما دستنخورده هستند.
مرجع سریع
┌─────────────────────────────────────────────────────────────┐
│ GITHUB SYNC │
│ مرجع سریع │
├─────────────────────────────────────────────────────────────┤
│ باز کردن Sync Settings │ تنظیمات → Sync │
│ راهاندازی اول │ کلیک "Set Up GitHub Sync" │
│ scopeهای لازم │ contents: write، admin: write │
│ نامگذاری مخزن │ یک مخزن خصوصی به ازای هر workspace │
├─────────────────────────────────────────────────────────────┤
│ فاصله همگامسازی پیشفرض │ 5 دقیقه (1 / 5 / 10 / 30) │
│ اجبار یک همگامسازی │ دکمه "همگامسازی اکنون" │
│ همگامسازی خودکار در push │ روشن (تغییر وضعیت در Sync Settings) │
│ همگامسازی در راهاندازی │ روشن (تغییر وضعیت در Sync Settings) │
├─────────────────────────────────────────────────────────────┤
│ حاشیه رفرش OAuth │ 5 دقیقه قبل از انقضا │
│ Timeout دستور Git │ 60 ثانیه (AbortController) │
│ محدودیت تلاش مجدد خودکار │ 5 تلاش، backoff نمایی │
│ ذخیره توکن │ keychain سیستمعامل (safeStorage) │
├─────────────────────────────────────────────────────────────┤
│ UI تعارض │ کلیک روی نوار وضعیت در conflict │
│ حل دستی │ ویرایش علامتها → Done │
│ ادغام Agent │ BYOK Pro + AI Agent پیکربندی شده │
├─────────────────────────────────────────────────────────────┤
│ قطع اتصال │ Sync Settings → Disconnect │
│ لغو از GitHub │ github.com/settings/installations │
│ مشاهده مخزن │ پیوند "مشاهده در GitHub" │
└─────────────────────────────────────────────────────────────┘
Last updated: 2026-06-04
← فصل 37: ارائهدهنده GitHub Copilot | (پایان دستی — بازگشت به Index)
Published: