
ماسح أسرار قائم على خطاف Git يكتشف الرموز وكلمات المرور والمفاتيح الخاصة في مجموعات التغييرات الصادرة، مما يمنع البيانات الحساسة من أن تُلتزم أو تُدفع إلى المستودعات.
أداة لاكتشاف ومنع تسرب الأسرار إلى نظام التحكم بالإصدارات
Talisman هي أداة تقوم بفحص مجموعات التغييرات في git لضمان عدم خروج الأسرار المحتملة أو المعلومات الحساسة من جهاز المطور.
تتحقق من مجموعة التغييرات الصادرة عن أي شيء يبدو مشبوهاً - مثل مفاتيح SSH المحتملة، ورموز التفويض، والمفاتيح الخاصة، إلخ.
يدعم Talisman أنظمة MAC OSX و Linux و Windows.
يمكن تثبيت Talisman واستخدامه بإحدى الطرق التالية:
يمكن إعداد Talisman كخطاف pre-commit أو pre-push على مستودعات git.
ابحث عن التعليمات أدناه.
تنويه: لا يمكن لـTalisman اكتشاف الأسرار التي تتسلل عبر push قسري في مستودع git. يُعتقد أن push القسري له سمعة سيئة بطرق مختلفة، ونقترح على مسؤولي مستودع git تطبيق التدابير المناسبة لتأذين مثل هذه الأنشطة.
نوصي بتثبيت talisman في المسار الخاص بك بحيث يكون متاحاً لأطر عمل الخطافات والنصوص البرمجية. اختر الملف الثنائي الصحيح لنظامك من صفحة الإصدارات، أو قم بتشغيل نص التثبيت:```bash
bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/install.sh)"
أو قم بتعيين متغير البيئة `INSTALL_LOCATION` لتحديد موقع مخصص للثنائي:```bash
INSTALL_LOCATION=/usr/local/bin bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/install.sh)"
أو قم بتعيين متغير البيئة VERSION إلى علامة إصدار لتثبيت إصدار معين::```bash
VERSION=v1.36.0 bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/install.sh)"
أو باستخدام linuxbrew في Linux و homebrew في macOS عن طريق تشغيل الأمر التالي في الطرفية:```bash
brew install talisman
نقدم نصوصًا برمجية تقوم بتثبيت Talisman كـ قالب خطاف pre-commit git، مما يؤدي إلى وجود Talisman ليس فقط في مستودعات git الحالية، بل أيضًا في أي مستودع جديد تقوم بعملية 'init' أو 'clone'.
كخطاف pre-commit: ``` bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/global_install_scripts/install.bash)"
أو
كخطاف ما قبل الدفع: ```
bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/global_install_scripts/install.bash)" -- pre-push
$PATH الخاص بك، سيُطلب منك اختيار مكان مناسب لتعيينه. اختر رقم الخيار حيث تقوم بتعيين مصدر ملف التعريف على جهازك.تذكر تنفيذ source على ملف المسار أو إعادة تشغيل الطرفية.
إذا اخترت تعيين $PATH لاحقًا، يُرجى تصدير TALISMAN_HOME=$HOME/.talisman/bin إلى المسار.
لن يؤدي تثبيت talisman كخطاف عالميًا إلى الكتابة فوق أي خطافات موجودة. إذا وجد سكريبت التثبيت أي خطافات موجودة، فسيشير إلى ذلك فقط على وحدة التحكم. لتشغيل خطافات متعددة، نقترح استخدام إطار عمل للخطافات، مثل pre-commit أو husky. تفترض هذه التعليمات أن الملف التنفيذي لـ talisman مثبت في مكان ما على مسار النظام الخاص بك.
استخدم pre-commit لإدارة الخطافات الموجودة إلى جانب Talisman. قم بالإشارة إلى pre-commit-hooks الخاص بنا في ملف .pre-commit-config.yaml الخاص بك:
repos:
- repo: https://github.com/thoughtworks/talisman
rev: '' # Use the latest release version
hooks:
- id: talisman-precommit
``````yaml
- repo: https://github.com/thoughtworks/talisman
rev: 'v1.32.2' # Update me!
hooks:
# both pre-commit and pre-push supported
# - id: talisman-push
- id: talisman-commit
husky هي وحدة npm لإدارة الخطافات (hooks).
أضف السطر التالي إلى تكوين pre-commit الخاص بـ husky في ملف
package.json:```
talisman --githook pre-commit
## استدعاء تاليسمان مباشرةً
بمجرد تثبيت ملف تاليسمان القابل للتنفيذ [المثبت](#install-onto-path-recommended-approach) يمكنك تكوين خطاف pre-commit مستقل لمستودع git:```bash
cd my-git-project
echo "talisman -g pre-commit" >> .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
منذ الإصدار v0.4.4، يقوم Talisman بتحديث الملف الثنائي تلقائيًا إلى أحدث إصدار عند استدعاء الخطاف (في وقت pre-commit/pre-push، حسب الإعداد). لذا، فقط استرخِ واستمر في استخدام أحدث إصدار من Talisman دون أي جهد إضافي.
يمكن تعيين متغيرات البيئة التالية:
إذا كنت بحاجة إلى الترقية يدويًا، فإليك الخطوات:
[مُوصى به] تحديث ملف Talisman الثنائي ونصوص الخطافات إلى أحدث إصدار:```bash
curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/global_install_scripts/update_talisman.bash > /tmp/update_talisman.bash && /bin/bash /tmp/update_talisman.bash
قم بتحديث تاليسمان الثنائي فقط عن طريق تنفيذ:```bash
curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/global_install_scripts/update_talisman.bash > /tmp/update_talisman.bash && /bin/bash /tmp/update_talisman.bash talisman-binary
بعد نجاح التثبيت، سيقوم Talisman بتشغيل فحوصات للأسرار الواضحة تلقائيًا قبل كل commit أو push (كما تم اختياره أثناء التثبيت). في حالة اكتشاف أي خروقات أمنية، سيعرض Talisman تقريرًا مفصلاً عن الأخطاء:```bash $ git push Talisman Report: +-----------------+-------------------------------------------------------------------------------+ | FILE | ERRORS | +-----------------+-------------------------------------------------------------------------------+ | danger.pem | The file name "danger.pem" | | | failed checks against the | | | pattern ^.+.pem$ | +-----------------+-------------------------------------------------------------------------------+ | danger.pem | Expected file to not contain hex encoded texts such as: | | | awsSecretKey=c64e8c79aacf5ddb02f1274db2d973f363f4f553ab1692d8d203b4cc09692f79 | +-----------------+-------------------------------------------------------------------------------+
في المثال أعلاه، تم وضع علامة على الملف *danger.pem* باعتباره خرقًا أمنيًا للأسباب التالية:
* اسم الملف يطابق أحد الأنماط المكونة مسبقًا.
* يحتوي الملف على awsSecretKey الذي يتم فحصه ووضع علامة عليه بواسطة Talisman
إذا كنت قد قمت بتثبيت Talisman كخطاف pre-commit، فسيقوم بفحص _الفرق_ (_diff_) داخل كل Commit فقط. هذا يعني أنه سيبلغ عن الأخطاء فقط للأجزاء التي تم تغييرها من الملف.
في حال قمت بتثبيت Talisman كخطاف pre-push، فسيقوم بفحص الملف بالكامل الذي تم إجراء التغييرات فيه. كما ذكر أعلاه، يُنصح باستخدام Talisman كـ **خطاف pre-commit**.
## عمليات التحقق
تقوم أجهزة الكشف التالية بالتنفيذ على مجموعات التغييرات للكشف عن الأسرار/المعلومات الحساسة:
* **القيم المشفّرة** - يقوم بفحص الأسرار المشفّرة بتنسيق Base64 أو hex أو غيرهما
* **محتوى الملف** - يقوم بفحص المحتوى المشبوه في الملف الذي قد يكون أسرارًا أو كلمات مرور محتملة
* **حجم الملف** - يقوم بفحص الملفات الكبيرة التي قد تحتوي على مفاتيح أو أسرار أخرى
* **الإنتروبيا** - يقوم بفحص المحتوى ذي الإنتروبيا العالية الذي من المحتمل أن يحتوي على كلمات مرور
* **أرقام بطاقات الائتمان** - يقوم بفحص المحتوى الذي قد يكون أرقام بطاقات ائتمان محتملة
* **أسماء الملفات** - يقوم بفحص أسماء الملفات وامتداداتها التي قد تشير إلى احتمالية احتوائها على أسرار، مثل المفاتيح وبيانات الاعتماد وغيرها
## تجاهل الملفات
إذا كنت *متأكدًا جدًا* من رغبتك في دفع هذا الملف، يمكنك تكوينه في ملف `.talismanrc` في جذر المشروع. سيتم طباعة المحتويات المطلوبة لتجاهل ملفاتك الفاشلة بواسطة Talisman على وحدة التحكم فورًا بعد تقرير خطأ Talisman:```bash
If you are absolutely sure that you want to ignore the above files from talisman detectors, consider pasting the following format in .talismanrc file in the project root
fileignoreconfig:
- filename: danger.pem
checksum: cf97abd34cebe895417eb4d97fbd7374aa138dcb65b1fe7f6b6cc1238aaf4d48
ignore_detectors: []
إدخال هذا في ملف .talismanrc سيضمن أن يتجاهل Talisman ملف danger.pem طالما أن المجموع الاختباري يطابق القيمة المذكورة في حقل checksum.
متاح فقط لمستخدمي أنظمة غير ويندوز
إذا كانت عملية نسخ المحتوى إلى .talismanrc في كل مرة تواجه فيها خطأ من Talisman أمرًا مزعجًا، يمكنك تفعيل الوضع التفاعلي والسماح لـ Talisman بمساعدتك في إضافة الملفات المراد تجاهلها بسرعة.
ما عليك سوى اتباع الخطوات البسيطة التالية:
TALISMAN_INTERACTIVE تحت # >>> talisman >>>export TALISMAN_INTERACTIVE=trueهذا كل شيء! كلما وجد خطاف Talisman خطأً أثناء pre-push/pre-commit، اتبع التعليمات كما يقترحها Talisman. كن حريصًا على عدم تجاهل ملف دون التحقق من محتواه. يجب أن تكون واثقًا من عدم تسرب أي سر.
فيما يلي وصف تفصيلي للحقول المختلفة التي يمكن تكوينها في ملف .talismanrc:
filename: يجب أن يذكر هذا الحقل اسم الملف المؤهل بالكامل.checksum: يجب أن يحتوي هذا الحقل دائمًا على القيمة المحددة بواسطة Talisman في الرسالة المعروضة أعلاه. إذا تم إجراء تغيير جديد على الملف في أي وقت، فسيؤدي ذلك إلى إنشاء مجموع اختباري جديد وسيقوم Talisman بفحص الملف مرة أخرى بحثًا عن أي تهديدات أمنية محتملة.ignore_detectors: سيقوم هذا الحقل بتعطيل كشافات معينة لملف معين.
على سبيل المثال، إذا كان اسم ملف init-env.sh الخاص بك يؤدي إلى تحذير، يمكنك تعطيل هذا التحذير فقط
مع الاستمرار في التنبيه إذا حدثت مشكلات أخرى (مثل محتوى الملف):```yaml
fileignoreconfig:ملاحظة: هنا يتم تجاهل كاشفي اسم الملف وحجم الملف بالنسبة لـ `init-env.sh`، ولكن
كاشف محتوى الملف سيظل يعمل على `init-env.sh`
في الوقت الحالي، يمكنك تجاهل
* `filecontent`
* `filename`
* `filesize`
### تجاهل كلمات مفتاحية محددة
نظرًا لأن بعض ملفاتك قد تحتوي على كلمات مفتاحية مثل `key` أو `pass` والتي لا تتعلق بالضرورة بالأسرار، فقد ترغب في تجاهل هذه الكلمات المفتاحية لتقليل عدد النتائج الإيجابية الخاطئة.
يمكن تحقيق ذلك باستخدام حقل `allowed_patterns` على مستوى الملف و/أو على مستوى المستودع:```yaml
fileignoreconfig:
- filename: test
allowed_patterns: [key]
allowed_patterns:
- keyword
- pass
في المثال السابق، key مسموح به في ملف test، و keyword و pass مسموح بهما على مستوى المستودع.
حقل allowed_patterns يدعم أيضًا التعبيرات العادية في Golang. إليك مثال بسيط على الكود حيث يمكن أن يكون RegExp في Golang مفيدًا:```sh
export AWS_ACCESS_KEY_ID = AKIAIO5FODNN7EXAMPLE
export AWS_ACCESS_KEY_ID=$(vault read -field=value path/to/aws-access-key-id)
بشكل افتراضي، سيقوم Talisman بالتنبيه لكل من السطرين. في السطر الثاني، نقوم باستخراج AWS Access Key ID من Hashicorp Vault والتي لا تكشف السر للكود. إذا كان هذا النوع من الاستخدام شائعًا في كودك، فقد ترغب في إخبار Talisman بعدم التنبيه عند استخدام Vault. يمكن تحقيق ذلك من خلال تكوين مثل:```yaml
allowed_patterns:
- export\ AWS[ \w]*KEY[ \w]*=.*vault\ read.*
يمكنك اختيار تجاهل جميع الملفات من نوع معين، لأنك تعلم أنها ستكون آمنة دائمًا، ولا تريد أن يقوم Talisman بفحصها.
الخطوات:
*.locktalisman --checksum="*.lock"إذا تم تعديل أي من الملفات، فسيقوم talisman بفحص الملفات مرة أخرى، إلا إذا قمت بإعادة حساب المجموع الاختباري الجديد واستبداله في ملف .talismanrc.
يمكنك اختيار تجاهل الملفات عن طريق تحديد نطاق اللغة لمشروعك في ملف talismanrc الخاص بك.```yaml scopeconfig:
تم تكوين Talisman لتجاهل ملفات معينة بناءً على النطاق المحدد. على سبيل المثال، ذكر نطاق node في scopeconfig سيمنع talisman من فحص ملفات مثل yarn.lock أو package-lock.json.
يمكنك تحديد نطاقات متعددة.
حاليًا، يدعم .talismanrc دعم scopeconfig لـ go و node و php و images. سيتم إضافة نطاقات أخرى قريبًا.
### أنماط البحث المخصصة
يمكنك تحديد أنماط regex مخصصة للبحث عنها في المستودع الحالي.```yaml
custom_patterns:
- pattern1
- pattern2
ملاحظة: تم إهمال استخدام .talismanignore. يحل محله ملف .talismanrc للأسباب التالية:
يرتبط كل تحقق بخطورة
يمكنك تحديد حد في ملف .talismanrc الخاص بك:```yaml threshold: medium
سيؤدي هذا إلى الإبلاغ عن جميع المشكلات ذات الخطورة المتوسطة والأعلى (سيتم الإبلاغ عن المخاطر المحتملة التي تقل عن العتبة في التحذيرات)
1. يمكن العثور على قائمة بجميع المخاطر مع مستوى خطورتها في [ملف التكوين](https://github.com/thoughtworks/talisman/blob/HEAD/detector/severity/severity_config.go) هذا.
2. بشكل افتراضي، يتم تعيين العتبة على منخفض.
3. أي أنماط بحث مخصصة تقوم بإضافتها، تعتبر ذات خطورة عالية.
## تكوين الخطورة المخصصة
يمكنك تخصيص [مستويات الأمان](https://github.com/thoughtworks/talisman/blob/HEAD/detector/severity/severity_config.go) لأجهزة الكشف التي يوفرها Talisman في ملف .talismanrc:```yaml
custom_severities:
- detector: Base64Content
severity: medium
- detector: HexContent
severity: low
باستخدام درجات خطورة مخصصة وعتبة خطورة، يمكن تهيئة Talisman لتنبيه فقط بما هو مهم بناءً على سياقك. يمكن أن يكون هذا مفيدًا لتقليل عدد النتائج الإيجابية الخاطئة.
إذا قمت بتنفيذ talisman في سطر الأوامر، فستتمكن من عرض جميع خيارات الوسائط التي يمكنك تمريرها```
-c, --checksum string checksum calculator calculates checksum and suggests .talismanrc format
-d, --debug enable debug mode (warning: very verbose)
-g, --githook string either pre-push or pre-commit (default "pre-push")
--ignoreHistory scanner scans all files on current head, will not scan through git commit history
-i, --interactive interactively update talismanrc (only makes sense with -g/--githook)
-p, --pattern string pattern (glob-like) of files to scan (ignores githooks)
-r, --reportdirectory string directory where the scan reports will be stored
-s, --scan scanner scans the git commit history for potential secrets
-w, --scanWithHtml generate html report (Make sure you have installed talisman_html_report to use this, as mentioned in Readme)
-v, --version show current version of talisman
### الوضع التفاعلي
عندما يكون لديك بانتظام عدد كبير جدًا من الملفات التي يتم الإبلاغ عنها بواسطة خطاف Talisman، والتي تعلم أنه يجب أن يكون من الجيد إيداعها، يمكنك استخدام هذه الميزة للسماح لـ Talisman بتسهيل العملية عليك. سيسمح لك الوضع التفاعلي بإظهار موجه من Talisman لإضافة الملفات التي تريد تجاهلها مباشرةً إلى ملف .talismanrc من موجه الأوامر.
لتمكين هذه الميزة، تحتاج إلى تعيين المتغير TALISMAN_INTERACTIVE على القيمة true في ملف bash الخاص بك.
يمكنك استدعاء Talisman في الوضع التفاعلي بإحدى الطريقتين التاليتين:
1. افتح ملف bash الخاص بك، وأضف```export TALISMAN_INTERACTIVE=true```
Don't forget to source the bash file for the variable to take effect!
2. Alternatively, you can also invoke the interactive mode by using the CLI utility
(for using pre-commit hook)
```talisman -i -g pre-commit```
*ملاحظة*: إذا كنت تستخدم تكامل التحكم في الإصدارات (Version Control) في بيئة التطوير المتكاملة (IDE) لعمليات git، فلن تعمل هذه الميزة. لا يزال بإمكانك استخدام اسم الملف المقترح والمجموع الاختباري لإدخالهما يدويًا في ملف `.talismanrc`.
### ماسح تاريخ Git
يمكنك الآن تشغيل Talisman من سطر الأوامر، وإضافته إلى خطط التكامل المستمر/النشر المستمر (CI/CD)، لمسح تاريخ git لمستودعك بحثًا عن أي محتوى حساس. يتضمن ذلك مسح الملفات المدرجة في ملف `.talismanrc` أيضًا.
**الخطوات**:
1. انتقل إلى مسار دليل git المراد مسحه: `cd <directory to scan>`
2. قم بتشغيل أمر المسح: `talisman --scan`
* سيؤدي تشغيل هذا الأمر إلى إنشاء مجلد باسم `<i>talisman_reports</i>` في جذر الدليل الحالي وتخزين ملفات التقرير هناك.
* يمكنك أيضًا تحديد موقع التقارير عن طريق توفير معلمة إضافية كـ `<i>--reportdirectory</i>` أو `<i>--rd</i>`
<br>على سبيل المثال: `talisman --scan --reportdirectory=/Users/username/Desktop`
يمكنك استخدام الخيارات الأخرى للمسح كما هو موضح أعلاه.
<i>حاليًا لا يدعم Talisman تجاهل الملفات للمسح.</i>
### حاسبة المجموع الاختباري
تعطي حاسبة المجموع الاختباري في Talisman تنسيق yaml يمكنك نسخه ولصقه مباشرة في ملف `.talismanrc` لتجاهل تنسيقات ملفات معينة من أدوات الكشف في Talisman.
لتشغيل المجموع الاختباري، يرجى الانتقال إلى جذر مستودعك باستخدام الأمر "cd" وتشغيل الأمر التالي
على سبيل المثال:
`talisman --checksum="*.pem *.txt"`
1. يعثر هذا الأمر على جميع ملفات `.pem` في المستودع ويحسب المجموع الاختباري الجماعي لهذه الملفات ويخرج بتنسيق yaml لملف `.talismanrc`. وبالمثل يتعامل مع ملفات `.txt`.
2. يمكن إعطاء أسماء/أنماط ملفات متعددة مفصولة بمسافات.
مثال على الإخراج:
.talismanrc format for given file names / patterns
fileignoreconfig:
- filename: '*.pem'
checksum: f731b26be086fd2647c40801630e2219ef207cb1aacc02f9bf0559a75c0855a4
ignore_detectors: []
- filename: '*.txt'
checksum: d9e9e94868d7de5b2a0706b8d38d0f79730839e0eb4de4e9a2a5a014c7c43f35
ignore_detectors: []
ملاحظة: حاسبة المجموع الاختباري تأخذ في الاعتبار الملفات المعلقة (staged files) عند حساب المجموع الاختباري الجماعي للملفات.
# تقارير Talisman بتنسيق HTML
<i>مدعوم من <a href="https://jaydeepc.github.io/report-mine-website/"><img class=logo align=bottom width="10%" height="10%" src="https://raw.githubusercontent.com/jaydeepc/talisman-html-report/master/img/logo_reportmine.png" /></a></i>
تأتي أداة سطر الأوامر `talisman` أيضًا مع إمكانية تقديم تقرير HTML مفصل وقابل للمشاركة. بمجرد تثبيت Talisman، يرجى اتباع الخطوات المذكورة في [talisman-html-report](https://github.com/jaydeepc/talisman-html-report)، لتثبيت حزمة إعداد التقارير في مجلد `.talisman`. لإنشاء تقرير HTML، قم بتشغيل:
* `talisman --scanWithHtml`
سيؤدي هذا إلى مسح المستودع وإنشاء مجلد `talisman_html_report` داخل المستودع الممسوح ضوئيًا. نحتاج إلى بدء تشغيل خادم HTTP داخل هذا المستودع للوصول إلى التقرير. فيما يلي طريقة موصى بها لبدء تشغيل خادم HTTP:
* `python -m SimpleHTTPServer <port> (مثال: 8000)`
يمكنك الآن الوصول إلى التقرير بالانتقال إلى:
`http://localhost:8000`
## لقطات شاشة نموذجية
* الترحيب
<img width="100%" height="70%" src="https://raw.githubusercontent.com/jaydeepc/talisman-html-report/master/sample/summary.png" />
* الملخص
<img width="100%" height="70%" src="https://raw.githubusercontent.com/jaydeepc/talisman-html-report/master/sample/execution-summary.png" />
* التقرير التفصيلي
<img width="100%" height="70%" src="https://raw.githubusercontent.com/jaydeepc/talisman-html-report/master/sample/detailed.png" />
* تقرير الأخطاء
<img width="100%" height="70%" src="https://raw.githubusercontent.com/jaydeepc/talisman-html-report/master/sample/error-report.png" />
<i> **ملاحظة**: لست بحاجة إلى بدء تشغيل خادم إذا كنت تشغل Talisman في بيئة CI أو أي بيئة مستضافة أخرى </i>
# إلغاء التثبيت
تعتمد عملية إلغاء التثبيت على كيفية تثبيت Talisman. قد تكون اخترت التثبيت كقالب خطاف عام (global hook template) أو في مستودع واحد.
يرجى اتباع الخطوات أدناه بناءً على الخيار الذي اخترته أثناء التثبيت.
## إلغاء التثبيت من قالب خطاف عام
قم بتشغيل الأمر التالي في الطرفية الخاصة بك لإلغاء تثبيت Talisman بشكل عام من جهازك.
لخطاف ما قبل الالتزام (pre-commit hook):```
bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/global_install_scripts/uninstall.bash)"
لخطاف ما قبل الدفع:``` bash -c "$(curl --silent https://raw.githubusercontent.com/thoughtworks/talisman/main/global_install_scripts/uninstall.bash)" -- pre-push
سيؤدي هذا إلى
1. سيطالبك بتحديد الدليل الأساسي لجميع مستودعاتك، وسيجد جميع مستودعات git بداخله ويزيل خطافات talisman
2. إزالة خطاف talisman من .git-template
3. إزالة talisman من موقع التثبيت المركزي ($HOME/.talisman/bin).<br>
<i>سيتعين عليك إزالة TALISMAN_HOME من متغيرات البيئة الخاصة بك يدويًا</i>
## إلغاء التثبيت من مستودع واحد
عند تثبيت Talisman، لا بد أنه أنشأ خطاف pre-commit أو pre-push (حسب ما تم اختياره) في مستودعك أثناء التثبيت.
يمكنك إزالة الخطاف يدويًا عن طريق حذف خطاف Talisman pre-commit أو pre-push من مجلد .git/hooks في المستودع.
# المساهمة في Talisman
للمساهمة في Talisman، ألقِ نظرة على [دليل المساهمة](https://github.com/thoughtworks/talisman/blob/HEAD/contributing.md) الخاص بنا.