Computer screen displays "vibe vibe coding" text.

Apps

VS Code تضيف "Co-Authored-by Copilot" لكل التزام

يقوم امتداد Copilot في VS Code بحقن "Co-Authored-by" لـ GitHub Copilot تلقائياً في رسائل الالتزام — حتى عندما تكتب كل سطر بنفسك. إليك كيفية إيقافه تماماً.

TLDR يضيف امتداد GitHub Copilot في VS Code تلقائياً مقطع "Co-authored-by: GitHub Copilot" إلى رسائل الالتزام كلما كان متورطاً في إنشاء الكود — وأحياناً حتى عندما لا يكون كذلك. هذا يؤثر على سجلات الإسناد، وسجلات المساهمة مفتوحة المصدر، وربما على سياسات IP الخاصة بصاحب العمل. يمكنك إيقافه باستخدام git hook أو تغيير إعدادات VS Code أو قاعدة gitconfig عام — لكل منها مقابلات مختلفة.

إذا ألقيت نظرة على git log مؤخراً لاحظت سطراً غريباً في نهاية رسائل الالتزام التي كتبتها بالكامل بنفسك، فأنت لا تتخيل ذلك. GitHub Copilot — أو بشكل أدق، امتداد Copilot في VS Code — كان يختم اسمه في الالتزامات بصمت كمؤلف مشارك، بغض النظر عما إذا لمس سطراً واحداً من الكود الذي دفعته. هذا ليس مؤامرة؛ إنه نظام إسناد opt-out بشكل افتراضي لم يوافق عليه معظم المطورين بوعي. ما يلي هو تحليل دقيق لكيفية عمل الحقن، ولماذا بنت GitHub ذلك بهذه الطريقة، والأهم — بالضبط ما هي الإعدادات والخطافات والإعدادات التي ستجعله يتوقف.

لوحة التحكم في السيطرة على المصدر في VS Code تظهر توليد رسالة الالتزام بـ Copilot


ما يبدو عليه المقطع فعلياً

قبل إصلاح أي شيء، من المفيد معرفة بالضبط ما تتعامل معه. النص المحقون هو مقطع التزام git قياسي — زوج مفتاح-قيمة مرفق بعد سطر فارغ في نهاية نص رسالة الالتزام. يتبع نفس الصيغة المستخدمة من قبل git interpret-trailers والأدوات مثل Gerrit وبنية GitHub الخاصة بدمج:

feat: add user authentication flow

Implement JWT-based login with refresh token rotation.

Co-authored-by: GitHub Copilot <github-copilot[bot]@users.noreply.github.com>

هذا السطر الأخير هو ما يحقنه Copilot. عنوان البريد الإلكتروني github-copilot[bot]@users.noreply.github.com هو حساب bot GitHub حقيقي، مما يعني أن رسم GitHub للمساهمات وآلية الإسناد للالتزام تسجل هذا بالفعل كمؤلفة مشاركة — ليس تعليقاً، ليس بيانات وصفية يمكنك تجاهلها. إنه كائن git من الدرجة الأولى مضمن في سجل الالتزام الخاص بك بشكل دائم بمجرد الدفع.

حيث يظهر

  • طريقة عرض الالتزام على GitHub: سيعرض الالتزام شارة "تم تأليفه بواسطة GitHub Copilot" بجانب صورتك الرمزية.
  • git log --format=full: يظهر المقطع في نص الالتزام الكامل.
  • git shortlog: بناءً على التحليل، قد يظهر Copilot كمساهم في إحصائيات المشروع.
  • رسم مساهمي GitHub: قد يسجل حساب bot كمساهم في المستودع الخاص بك.
Warning بمجرد أن تكون قد دفعت التزاماً يحتوي على هذا المقطع إلى بعيد مشترك، فإن إعادة كتابة السجل (عبر git rebase -i أو git filter-branch) لإزالته عملية مدمرة ستفرض الدفع وتكسر السجل المحلي للزملاء. الوقاية أسهل بكثير من العلاج.

الالتزام الذي من المرجح أن يظهر فيه

الحقن هو الأكثر عدوانية عندما تستخدم ميزة Generate Commit Message في VS Code — رمز البريق (✨) في شريط التحكم في المصدر. انقر عليه، يقوم Copilot بتصميم رسالة، والمقطع لمؤلف مشارك مرفق قبل حتى تؤكد. لكن التقارير من المطورين تؤكد أنه يظهر أيضاً في الالتزامات حيث تمت كتابة الرسالة يدوياً، خاصة إذا كان Copilot Chat نشطاً في تلك الجلسة وتم استخدامه لإنشاء أي كود في الملفات المرحلة.


الآلية وراء الحقن

يتكامل امتداد GitHub Copilot في VS Code مع Source Control Manager (SCM) API في VS Code على مستوى منخفض. عندما تقوم بتنظيم الملفات وفتح صندوق إدخال رسالة الالتزام، يسجل Copilot كموفر صندوق إدخال SCM ويمكن أن ينسكب أو يعدل حقل النص — بما في ذلك إلحاق المقاطع برمجياً قبل أن تكتب حرفاً واحداً.

هذا ليس ميزة غير شرعية. إنها سلوك موثق يرتبط بفلسفة الإسناد الذكية لدى GitHub: إذا ساهمت نموذج ذكي بشكل كبير في قطعة عمل، يعتقد GitHub أن هذه المساهمة يجب أن يتم تسجيلها. المشكلة هي التنفيذ: تم تفسير "ساهم بكثرة" بنطاق واسع جداً من قبل الامتداد، وواجهة المستخدم opt-out مدفونة عدة قوائم عميقة بدلاً من أن تكون دعوة بارزة عند التشغيل الأول.

كيفية تفعيل API VS Code SCM لهذا

يكشف VS Code vscode.scm.inputBox و APIs ذات الصلة التي يمكن للامتدادات ربطها. يستخدم امتداد Copilot هذا لـ:

  1. مراقبة الملفات المرحلة والفروقات الخاصة بها.
  2. تحديد ما إذا كان تم استدعاء Copilot (أو مجرد نشط) أثناء تحرير تلك الملفات.
  3. إنشاء رسالة التزام عبر Copilot API.
  4. حقن الرسالة — بما في ذلك المقطع — في حقل إدخال الالتزام قبل الإرسال.

يحدث الحقن على الجانب من العميل في VS Code، وليس على خوادم GitHub، مما يعني أن القواعد على الجانب من الخادم أو حماية الفروع لا يمكنها اكتشافه قبل دخوله سجلك.

Info هذا السلوك مختلف عن إسناد Copilot من جانب الخادم في GitHub لطلبات السحب. ما يفعله امتداد VS Code هو حقن نص من جانب العميل في حقل رسالة الالتزام — مسار رمز مختلف تماماً.

هل يحدث بدون استخدام ميزة الإنشاء؟

نعم — وهذا هو الجزء الذي يحبط المطورين أكثر. يبلغ المستخدمون عن المقطع الذي يظهر حتى عندما:

  • كتبوا رسالة الالتزام يدوياً (وليس عبر زر البريق).
  • التغييرات المرحلة كانت 100٪ مكتوبة بخط اليد.
  • Copilot Chat كان مفتوحاً لكن لم يتم استشارته للمهمة الحالية.

يوجد الامتداد لـ "تم اشتراك Copilot" فضفاضة. إذا كان Copilot نشطاً أثناء جلسة التحرير لأي ملف في الفرق — حتى لو رفضت كل اقتراح — قد يظل يلحق المقطع. هذا هو جوهر الشكوى: إنه ليس إسناداً للمساهمة الذكية الفعلية، بل إسناد بالقرب.


لماذا يأتي هذا أبعد من الجماليات

شبح مؤلف مشارك في git log قد يبدو وكأنه مزعج تجميلي، لكن هناك عواقب حقيقية في الجانب الآخر تستحق الفهم قبل أن تقرر كم الاستعجالية للعمل.

المطور يراجع git log في Terminal يظهر الالتزامات التي تمت تأليفها بشكل مشترك

سياسات الملكية الفكرية وصاحب العمل

العديد من أصحاب العمل — خاصة في الصناعات المنظمة مثل التمويل والرعاية الصحية والعقود الدفاعية — لديهم سياسات IP صريحة حول الكود الذي تم إنشاؤه بواسطة الذكاء الاصطناعي. سطر "Co-authored-by: GitHub Copilot" في التزام لقاعدة بيانات ملكية هو سجل موثق بأن أدوات الذكاء الاصطناعي كانت متورطة في إنشاء هذا الكود. حتى لو أكمل Copilot فقط قوس إغلاق، فإن هذا المقطع ينشئ مسار تدقيق قد تحتاج فرق الشؤون القانونية إلى معالجته.

إذا لم تقرر شركتك بوضوح استخدام Copilot للكود الإنتاجي، فهذا المقطع هو مسؤولية لم توافق عليها.

مؤثرات ترخيص المصدر المفتوح

الوضع القانوني للكود الذي تم إنشاؤه بواسطة الذكاء الاصطناعي وتوافقه مع تراخيص Copyleft (GPL, AGPL) لا يزال غير محسوم. قد ترفض المشاريع ذات سياسات المساهمة الصارمة أو تطلب إعادة كتابة السجل للالتزامات التي تتضمن إسناد Copilot — نشرت FSF والمنظمات الأخرى مواقفها على هذا. إذا كنت تحتفظ بمشروع مفتوح المصدر مع مساهمين يتوقعون نسب نظيف، فإن مقاطع Copilot في السجل الخاص بك تعقد ذلك.

إحصائيات المساهمين وملفات التوظيف

تُستخدم ملفات تعريف GitHub ورسوم المساهمين بشكل متزايد كملفات غير رسمية — من قبل جنود التوظيف، من قبل المتعاونين المحتملين، من قبل لجان برنامج المؤتمرات. وجود bot في قائمة مؤلفي مشاركين في الالتزامات في المستودعات العامة الخاصة بك يعكر إشارة الإسناد التي من المفترض أن توفرها تلك الرسوم. إنه شيء صغير، لكنه سجلك.

Warning إذا كنت مستقلاً أو مستشاراً تراجع عملاؤك git log كجزء من قبول التسليم، فإن إسناد Copilot على المستودعات المملوكة للعميل قد يؤدي إلى أسئلة العقد التي تفضل عدم الحصول عليها.

أربع طرق لإيقافها

لا توجد إصلاح قانوني واحد يعمل لكل سير عمل. الطريقة الصحيحة تعتمد على ما إذا كنت تريد حلاً عام أو استبدالاً لكل مستودع، أو شيئاً يحافظ على إنشاء رسالة الالتزام لـ Copilot لكن يزيل المقطع فقط.

الخيار 1 — إعدادات امتداد VS Code

المسار الأكثر مباشرة هو تعطيل السلوك من داخل إعدادات VS Code. افتح الإعدادات (Ctrl+, أو Cmd+,)، ثم ابحث عن "copilot commit". تبحث عن خيارات تحت امتداد GitHub Copilot المتعلقة بإنشاء رسالة الالتزام وإسناد المؤلف المشارك.

في settings.json، مسار التكوين ذو الصلة يبدو مثل هذا:

{
  "github.copilot.chat.generateCommitMessage.enabled": false
}

تعطيل إنشاء رسالة الالتزام بالكامل يوقف الحقن من المصدر — لن يقوم Copilot بملء حقل إدخال الالتزام على الإطلاق، لذلك لا توجد فرصة لإلحاق المقطع. إذا كنت لا تزال تريد رسائل التزام بمساعدة الذكاء الاصطناعي لكن بدون سطر الإسناد، فإن بعض إصدارات الامتداد تكشف تبديل منفصل لمقطع المؤلف المشارك بالتحديد. انتقل إلى Extensions > GitHub Copilot > Settings في شريط الجانب VS Code للتحقق مما هو متاح في الإصدار المثبت لديك، حيث تحول أسماء الإعدادات الدقيقة عبر إصدارات Copilot extension.

Tip سيعرض لك واجهة مستخدم إعدادات VS Code الإصدار الحالي للامتداد بجانب إعداداته. إذا كنت تستخدم بناء Copilot أقدم، فقد يؤدي تحديث الامتداد إلى منحك تحكماً أكثر دقة على السلوك — استجابت Microsoft لتعليقات المجتمع على هذا.

الخيار 2 — Git Hook (الأكثر موثوقية)

يتم تشغيل خطاف prepare-commit-msg تلقائياً قبل فتح محرر رسالة الالتزام، ويمكنه إزالة مقطع Copilot بشكل جراحي بغض النظر عن كيفية وصوله هناك. يعمل هذا النهج بشكل مستقل عن VS Code، ينجو من تحديثات الامتداد، وينطبق على أي عميل git تستخدمه في المستودع.

قم بإنشاء ملف الخطاف في .git/hooks/prepare-commit-msg:

#!/bin/sh
# Strip GitHub Copilot co-author trailer from commit messages
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"

ثم اجعله قابلاً للتنفيذ:

chmod +x .git/hooks/prepare-commit-msg

للحصول على حل يعم الفريق، استخدم دليل خطافات مشترك ملتزم بالمستودع وقم بتكوين git لاستخدامه:

# In .gitconfig or the repo's local config
git config core.hooksPath .githooks

ثم التزم بخطافك في .githooks/prepare-commit-msg بنفس المحتوى أعلاه. سيكون لدى كل مطور ينسخ المستودع وينفذ git config core.hooksPath .githooks (أو إذا قمت بأتمتة هذا في سكريبت الإعداد) سلوك التجريد المطبق.

Info يقوم علم -i على sed بتحرير الملف في المكان. على macOS، يتطلب BSD sed امتداد نسخ احتياطية صريح: sed -i '' '/^Co-authored-by: GitHub Copilot/Id' "$1". أضف شرطاً shell إذا كان فريقك يستخدم كل من Linux و macOS.

الخيار 3 — تعطيل Copilot لكل مساحة عمل

إذا كانت مخاوفك خاصة بمستودع (على سبيل المثال، مشروع عميل أو مستودع مفتوح المصدر مع قواعد نسب صارمة)، يمكنك تعطيل Copilot بالكامل لتلك مساحة العمل دون لمس الإعداد العام. في جذر المستودع، قم بإنشاء أو تحرير .vscode/settings.json:

{
  "github.copilot.enable": {
    "*": false
  }
}

هذا يعطل جميع ميزات Copilot — الكمالات والدردشة وإنشاء رسالة الالتزام — في تلك مساحة العمل فقط. عندما تبدل إلى مشروع شخصي، يتصرف Copilot بشكل طبيعي. الجانب السلبي هو أنك تفقد جميع المساعدة من Copilot في تلك المستودع، وليس فقط حقن المؤلف المشارك.

الخيار 4 — قاعدة تنظيف gitconfig العام

إذا كنت ترى أن المقطع يتسرب إلى الالتزامات من عدة أدوات وبيئات (وليس فقط VS Code)، فإن خطاف prepare-commit-msg عام في دليل قالب git المنزلي يغطي كل شيء:

# Set a global hooks template directory
git config --global init.templateDir ~/.git-templates

# Create the directory and hook
mkdir -p ~/.git-templates/hooks
cat > ~/.git-templates/hooks/prepare-commit-msg << 'EOF'
#!/bin/sh
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"
EOF
chmod +x ~/.git-templates/hooks/prepare-commit-msg

سيرث أي مستودع جديد تقوم بتهيئته أو استنساخه بعد هذه النقطة خطاف الخطاف هذا تلقائياً. بالنسبة للمستودعات الموجودة، قم بتشغيل git init في جذر المستودع — فهو آمن في المستودعات الموجودة ولن يلمس السجل الخاص بك.


مقارنة الخيارات الخاصة بك

الطريقة النطاق إزالة المقطع الحفاظ على الكمالات قابل للمشاركة من الفريق ينجو من تحديثات الامتداد
إعداد VS Code (تعطيل gen) عام أو مساحة عمل نعم لا عبر التزام settings.json نعم
خطاف prepare-commit-msg (محلي) لكل مستودع نعم نعم عبر نمط .githooks/ نعم
تعطيل مساحة العمل (copilot.enable) لكل مستودع نعم لا عبر التزام .vscode/settings.json نعم
خطاف قالب git عام جميع المستودعات (الجديد والمستقبلي) نعم نعم لا (مستوى المستخدم) نعم
تعطيل امتداد Copilot بالكامل عام نعم لا غير قابل للتطبيق غير قابل للتطبيق

الأفضل للأفراد الذين يريدون الاحتفاظ بـ Copilot completions: خطاف prepare-commit-msg + قالب عام.

الأفضل لفرق بها سياسات مشتركة: دليل .githooks/ ملتزم به مع توثيق الإعداد.

الأفضل للمستودعات الحساسة للعميل: تعطيل مستوى مساحة العمل copilot.enable: false ملتزم به في .vscode/settings.json.


تنظيف الالتزامات التي تحتوي بالفعل عليها

إذا كنت قد دفعت بالفعل الالتزامات مع مقطع Copilot إلى مستودع خاص وتريد تنظيف السجل، فالعملية تتطلب إعادة كتابة قسرية. قم بهذا فقط على الفروع حيث أنت المساهم الوحيد وأنت تفهم عواقب تغيير commit SHAs.

# Interactive rebase to edit recent commits
git rebase -i HEAD~10

# For each offending commit, mark it 'reword' then remove the trailer line
# Or use filter-branch for bulk cleaning:
git filter-branch --msg-filter \
  'sed "/^Co-authored-by: GitHub Copilot/Id"' \
  HEAD~20..HEAD

بعد إعادة الكتابة، ستحتاج إلى الدفع بالقوة:

git push --force-with-lease origin your-branch
Warning --force-with-lease أكثر أماناً من --force لأنه سيرفض الدفع إذا قام شخص آخر بدفع إلى الفرع منذ آخر fetch لديك. لن يحمي الفروع المشتركة العامة — تنسيق مع فريقك قبل القيام بهذا على أي شيء بخلاف فرع ميزة شخصي.

بالنسبة للمستودعات المدفوعة بالفعل إلى GitHub العام حيث لا تريد إعادة كتابة السجل، الإجابة العملية هي: وثق الموقف في ملف CONTRIBUTING الخاص بمشروعك، أضف خطاف على المستقبل، وقبل أن الالتزامات القديمة هي ما هي. إعادة كتابة السجل على المستودعات العامة النشطة تسبب مشاكل أكثر مما تحل.

إعدادات المستودع على GitHub تظهر قواعد حماية الفرع


قائمة تحقق سريعة

اعمل من خلال هذه بالترتيب بناءً على وضعك:

  1. تأكد من أنك ترى المقطع: قم بتشغيل git log --format=full -5 وتحقق من وجود Co-authored-by: GitHub Copilot في نهاية نص أي التزام.
  2. قم بتثبيت خطاف prepare-commit-msg في المستودع المتأثر — هذا هو الإصلاح الأقل احتكاكاً والأكثر موثوقية.
  3. تحقق من إعدادات Copilot في VS Code: افتح الإعدادات، ابحث عن "copilot commit"، وعطل إنشاء رسالة الالتزام إذا كنت لا تستخدم زر البريق.
  4. بالنسبة للمستودعات الحساسة: أضف .vscode/settings.json الذي يعطل Copilot لتلك مساحة العمل، والتزم به حتى يرث الزملاء الإعداد.
  5. لبيئات الفريق: قم بإنشاء دليل .githooks/، أضف سكريبت prepare-commit-msg، التزم به، وأضف git config core.hooksPath .githooks إلى تعليمات إعداد المشروع أو Makefile.
  6. قم بتعيين قالب git العام إذا كنت تعمل عبر العديد من المستودعات الشخصية وتريد تغطية "اضبطها واتركها".
  7. قم بتدقيق الالتزامات الأخيرة على الفروع المشتركة: استخدم git log --grep="Co-authored-by: GitHub Copilot" --oneline للعثور على الالتزامات المتأثرة قبل تقرير ما إذا كان تنظيف السجل مضموناً.
  8. تحقق من أن الإصلاح يعمل: قم بتنظيم ملف، دع VS Code تفتح حوار الالتزام، تحقق من أن المقطع غائب قبل تأكيد الالتزام.

المصادر والقراءة الإضافية

  • GitHub Docs — Commit Trailer Attribution — توثيق GitHub الرسمي حول كيفية عمل مقاطع المؤلف المشارك في رسم GitHub للمساهمات وما تعنيه صيغة Co-authored-by لإحصائيات المستودع وإسناد طلب السحب.

  • VS Code GitHub Copilot Extension Changelog (marketplace.visualstudio.com) — ملاحظات الإصدار لامتداد Copilot توثق متى تم تقديم إنشاء رسالة الالتزام والتغييرات اللاحقة على السلوك؛ ابحث عن الإصدارات من أواخر 2023 وما بعده.

  • git-scm.com — githooks Documentation — المرجع المرجعي لخطاف prepare-commit-msg، سياق استدعاؤه، الحجج، وكيف يتفاعل مع عملية الالتزام عبر عملاء git المختلفة.

  • Software Freedom Conservancy — Copyleft and AI-Generated Code — تحليل SFC المنشور حول كيفية تفاعل المخرجات من نموذج الذكاء الاصطناعي مع التزامات ترخيص GPL و AGPL، ذات الصلة لمحتفظين بمشروع مفتوح المصدر يقررون كيفية التعامل مع إسناد Copilot في المشاريع الخاصة بهم.

  • GitHub Community Forum — "Copilot adding Co-authored-by without my input" — خيوط نقاش مستمرة للمطورين توثق حالات العالم الحقيقي لسلوك الحقن، حلول تم تأكيدها من قبل المستخدم، وردود موظفي GitHub حول التصميم المقصود مقابل حالات الحدود المبلغ عنها.