تحليل تاريخ Git سريع ومفيد وقابل للتخصيص بدرجة كبيرة.
نظرة عامة • كيفية الاستخدام • التثبيت • المساهمات • الترخيص
Hercules هو محرك تحليل مستودع Git سريع بشكل مذهل وقابل للتخصيص بدرجة كبيرة ومكتوب بلغة Go. البطاريات متضمنة. مدعوم من go-git.
إشعار (نوفمبر 2020): عاد المؤلف الرئيسي من حالة النسيان ويستأنف التطوير تدريجيًا. انظر خريطة الطريق.
هناك نوعان من أدوات سطر الأوامر: hercules
و labours
. الأول هو برنامج مكتوب بلغة Go والذي يأخذ مستودع Git وينفذ رسمًا بيانيًا لا حلقيًا موجهًا (DAG) لمهام التحليل عبر سجل الالتزام الكامل. والثاني هو برنامج Python النصي الذي يعرض بعض المخططات المحددة مسبقًا على البيانات المجمعة. عادةً ما يتم استخدام هاتين الأداتين معًا من خلال أنبوب. من الممكن كتابة تحليلات مخصصة باستخدام نظام البرنامج المساعد. من الممكن أيضًا دمج العديد من نتائج التحليل معًا - وهو أمر مناسب للمؤسسات. يشتمل سجل الالتزام الذي تم تحليله على الفروع وعمليات الدمج وما إلى ذلك.
تم استخدام Hercules بنجاح في العديد من المشاريع الداخلية في المصدر {d}. هناك منشورات مدونة: 1، 2 وعرض تقديمي. يرجى المساهمة عن طريق الاختبار، أو إصلاح الأخطاء، أو إضافة تحليلات جديدة، أو التباهي بالبرمجة!
تحليل DAG للاحتراق والأزواج باستخدام تكرير فرق UAST. تم إنشاؤها باستخدام hercules --burndown --burndown-people --couples --feature=uast --dry-run --dump-dag doc/dag.dot https://github.com/src-d/hercules
تعطل خط تورفالدس/لينكس (التفاصيل 30، أخذ العينات 30، إعادة تشكيلها حسب السنة). تم إنشاؤها باستخدام hercules --burndown --first-parent --pb https://github.com/torvalds/linux | labours -f pb -m burndown-project
في ساعة و40 دقيقة.
احصل على ثنائي hercules
من صفحة الإصدارات. labours
قابلة للتثبيت من PyPi:
pip3 install labours
pip3
هو مدير حزم بايثون.
يمكن تثبيت Numpy وScipy على نظام التشغيل Windows باستخدام http://www.lfd.uci.edu/~gohlke/pythonlibs/
ستحتاج إلى Go (>= v1.11) و protoc
.
git clone https://github.com/src-d/hercules && cd hercules
make
pip3 install -e ./python
من الممكن تشغيل Hercules كإجراء GitHub: Hercules على GitHub Marketplace. يرجى الرجوع إلى نموذج سير العمل الذي يوضح كيفية الإعداد.
...مرحبا بكم! راجع المساهمة ومدونة قواعد السلوك.
أباتشي 2.0
مرجع سطر الأوامر الأكثر فائدة والأكثر موثوقية:
hercules --help
بعض الأمثلة:
# Use "memory" go-git backend and display the burndown plot. "memory" is the fastest but the repository's git data must fit into RAM.
hercules --burndown https://github.com/go-git/go-git | labours -m burndown-project --resample month
# Use "file system" go-git backend and print some basic information about the repository.
hercules /path/to/cloned/go-git
# Use "file system" go-git backend, cache the cloned repository to /tmp/repo-cache, use Protocol Buffers and display the burndown plot without resampling.
hercules --burndown --pb https://github.com/git/git /tmp/repo-cache | labours -m burndown-project -f pb --resample raw
# Now something fun
# Get the linear history from git rev-list, reverse it
# Pipe to hercules, produce burndown snapshots for every 30 days grouped by 30 days
# Save the raw data to cache.yaml, so that later is possible to labours -i cache.yaml
# Pipe the raw data to labours, set text font size to 16pt, use Agg matplotlib backend and save the plot to output.png
git rev-list HEAD | tac | hercules --commits - --burndown https://github.com/git/git | tee cache.yaml | labours -m burndown-project --font-size 16 --backend Agg --output git.png
labours -i /path/to/yaml
يسمح بقراءة الإخراج من hercules
الذي تم حفظه على القرص.
من الممكن تخزين المستودع المستنسخ على القرص. يمكن تشغيل التحليل اللاحق على الدليل المقابل بدلاً من الاستنساخ من البداية:
# First time - cache
hercules https://github.com/git/git /tmp/repo-cache
# Second time - use the cache
hercules --some-analysis /tmp/repo-cache
ينتج عن الإجراء قطعة أثرية تسمى hercules_charts
. نظرًا لأنه من المستحيل حاليًا تجميع عدة ملفات في قطعة أثرية واحدة، فإن جميع المخططات وملفات Tensorflow Projector معبأة في أرشيف القطران الداخلي. من أجل عرض التضمينات، انتقل إلى projector.tensorflow.org، وانقر فوق "تحميل" واختر جهازي TSV. ثم استخدم UMAP أو T-SNE.
docker run --rm srcd/hercules hercules --burndown --pb https://github.com/git/git | docker run --rm -i -v $(pwd):/io srcd/hercules labours -f pb -m burndown-project -o /io/git_git.png
hercules --burndown
labours -m burndown-project
إحصائيات توقف الخط للمستودع بأكمله. بالضبط نفس ما يفعله git-of-theseus ولكن بشكل أسرع بكثير. يتم تنفيذ إلقاء اللوم بكفاءة وتدريجي باستخدام خوارزمية تتبع شجرة RB مخصصة، ويتم تسجيل تاريخ التعديل الأخير فقط أثناء تشغيل التحليل.
تعتمد جميع تحليلات الاحتراق على قيم التفاصيل وأخذ العينات . التفصيل هو عدد الأيام التي يتكون منها كل نطاق في المكدس. أخذ العينات هو التكرار الذي يتم به التقاط حالة الإرهاق. كلما كانت القيمة أصغر، كانت الحبكة أكثر سلاسة ولكن تم إنجاز المزيد من العمل.
هناك خيار لإعادة تشكيل النطاقات داخل labours
، بحيث يمكنك تحديد توزيع دقيق للغاية وتصوره بطرق مختلفة. علاوة على ذلك، فإن إعادة المعاينة تؤدي إلى محاذاة النطاقات عبر الحدود الدورية، مثل الأشهر أو السنوات. يبدو أن النطاقات غير المعدلة غير متسقة وتبدأ من تاريخ ميلاد المشروع.
hercules --burndown --burndown-files
labours -m burndown-file
إحصائيات الانهيار لكل ملف موجود في المستودع وهو موجود في أحدث مراجعة.
ملاحظة: سيتم إنشاء رسم بياني منفصل لكل ملف. لا تريد تشغيله على مستودع يحتوي على العديد من الملفات.
hercules --burndown --burndown-people [--people-dict=/path/to/identities]
labours -m burndown-person
إحصائيات Burndown للمساهمين في المستودع. إذا لم يتم تحديد --people-dict
، فسيتم اكتشاف الهويات بواسطة الخوارزمية التالية:
إذا تم تحديد --people-dict
، فيجب أن يشير إلى ملف نصي به الهويات المخصصة. التنسيق هو: كل سطر هو مطور واحد، ويحتوي على جميع عناوين البريد الإلكتروني والأسماء المطابقة مفصولة بـ |
. يتم تجاهل القضية.
أفضل 20 مطورًا من Wireshark - يستبدل المصفوفة
hercules --burndown --burndown-people [--people-dict=/path/to/identities]
labours -m overwrites-matrix
بجانب معلومات الإيقاف، يقوم --burndown-people
بجمع إحصائيات الخط المضافة والمحذوفة لكل مطور. وبالتالي يمكن تصور عدد الأسطر التي كتبها المطور "أ" والتي تمت إزالتها بواسطة المطور "ب". ويشير هذا إلى التعاون بين الأشخاص ويحدد فرق الخبرة.
التنسيق هو المصفوفة التي تحتوي على صفوف N وأعمدة (N+2)، حيث N هو عدد المطورين.
--people-dict
، فهو دائمًا 0). يتم تخزين تسلسل المطورين في عقدة people_sequence
YAML.
Ember.js أفضل 20 مطورًا - ملكية الكود
hercules --burndown --burndown-people [--people-dict=/path/to/identities]
labours -m ownership
--burndown-people
يسمح أيضًا برسم مشاركة الكود من خلال مخطط المنطقة المكدسة بالوقت. أي عدد الأسطر الحية في اللحظات التي تم أخذ عينات منها لكل مطور تم تحديده.
اقتران ملفات torvalds/linux في Tensorflow Projector
hercules --couples [--people-dict=/path/to/identities]
labours -m couples -o <name> [--couples-tmp-dir=/tmp]
هام : يتطلب تثبيت Tensorflow، يرجى اتباع التعليمات الرسمية.
تقترن الملفات إذا تم تغييرها في نفس الالتزام. يقترن المطورون إذا قاموا بتغيير نفس الملف. يسجل hercules
عدد الأزواج في جميع أنحاء تاريخ الالتزام ويخرج مصفوفتي التكرار المتطابقتين. ثم يقوم labours
بتدريب التضمينات الدوارة - وهي نواقل كثيفة تعكس احتمالية الحدوث عبر المسافة الإقليدية. يتطلب التدريب تثبيت Tensorflow العامل. يتم تخزين الملفات الوسيطة في الدليل المؤقت للنظام أو --couples-tmp-dir
إذا تم تحديده. تتم كتابة التضمينات المدربة في دليل العمل الحالي بالاسم اعتمادًا على -o
. تنسيق الإخراج هو TSV ويطابق Tensorflow Projector بحيث يمكن تصور الملفات والأشخاص باستخدام t-SNE المطبق في TF Projector.
46 jinja2/compiler.py:visit_Template [FunctionDef]
42 jinja2/compiler.py:visit_For [FunctionDef]
34 jinja2/compiler.py:visit_Output [FunctionDef]
29 jinja2/environment.py:compile [FunctionDef]
27 jinja2/compiler.py:visit_Include [FunctionDef]
22 jinja2/compiler.py:visit_Macro [FunctionDef]
22 jinja2/compiler.py:visit_FromImport [FunctionDef]
21 jinja2/compiler.py:visit_Filter [FunctionDef]
21 jinja2/runtime.py:__call__ [FunctionDef]
20 jinja2/compiler.py:visit_Block [FunctionDef]
بفضل Babelfish، يستطيع هرقل قياس عدد المرات التي تم فيها تعديل كل وحدة هيكلية. بشكل افتراضي، فإنه ينظر إلى الوظائف؛ ارجع إلى دليل Semantic UAST XPath للتبديل إلى شيء آخر.
hercules --shotness [--shotness-xpath-*]
labours -m shotness
يقوم تحليل الأزواج تلقائيًا بتحميل بيانات "اللقطة" إذا كانت متوفرة.
hercules --shotness --pb https://github.com/pallets/jinja | labours -m couples -f pb
سلسلة الالتزام المتوافقة مع Tensorflow/tensorflow لأفضل 50 مطورًا حسب رقم الالتزام.
hercules --devs [--people-dict=/path/to/identities]
labours -m devs -o <name>
نحن نسجل عدد الالتزامات التي تم إجراؤها، بالإضافة إلى الأسطر المضافة والمحذوفة والمتغيرة يوميًا لكل مطور. نحن نرسم السلسلة الزمنية للالتزام الناتجة باستخدام بعض الحيل لإظهار التجميع الزمني. بمعنى آخر، يجب أن تبدو سلسلتا الالتزام المتجاورتان متشابهتين بعد التطبيع.
تسمح هذه الحبكة باكتشاف كيفية تطور فريق التطوير عبر الزمن. كما يعرض أيضًا "ارتكاب Flashmobs" مثل Hacktoberfest. على سبيل المثال، إليك الأفكار التي تم الكشف عنها من مخطط tensorflow/tensorflow
أعلاه:
تمت إضافة Tensorflow/tensorflow وتغيير الخطوط عبر الزمن.
hercules --devs [--people-dict=/path/to/identities]
labours -m old-vs-new -o <name>
--devs
من القسم السابق يسمح برسم عدد الأسطر التي تمت إضافتها وعدد الأسطر الموجودة التي تم تغييرها (المحذوفة أو المستبدلة) عبر الزمن. تم تنعيم هذه المؤامرة.
جهود kubernetes/kubernetes عبر الزمن.
hercules --devs [--people-dict=/path/to/identities]
labours -m devs-efforts -o <name>
علاوة على ذلك، يسمح --devs
برسم عدد الأسطر التي تم تغييرها (إضافتها أو إزالتها) بواسطة كل مطور. الجزء العلوي من قطعة الأرض عبارة عن جزء سفلي متراكم (متكامل). من المستحيل أن يكون لديك نفس المقياس لكلا الجزأين، لذلك يتم قياس القيم الأقل، وبالتالي لا توجد علامات أقل على المحور Y. هناك فرق بين مخطط الجهود ومخطط الملكية، على الرغم من أن تغيير الخطوط يرتبط بخطوط الملكية.
يمكن أن نرى بوضوح أن تعليقات جانغو كانت إيجابية/متفائلة في البداية، لكنها أصبحت فيما بعد سلبية/متشائمة.
hercules --sentiment --pb https://github.com/django/django | labours -m sentiment -f pb
نحن نستخرج التعليقات الجديدة والمتغيرة من الكود المصدري في كل التزام، ونطبق الشبكة العصبية المتكررة للمشاعر للأغراض العامة BiDiSentiment ونرسم النتائج. يتطلب libtensorflow. على سبيل المثال sadly, we need to hide the rect from the documentation finder for now
وهو أمر سلبي ولدى Theano has a built-in optimization for logsumexp (...) so we can just write the expression directly
بشكل إيجابي. لا تتوقع الكثير - كما هو مكتوب، نموذج المشاعر هو للأغراض العامة وتعليقات الكود لها طبيعة مختلفة، لذلك لا يوجد سحر (في الوقت الحالي).
يجب أن يتم إنشاء Hercules باستخدام علامة "tensorflow" - وهذا ليس افتراضيًا:
make TAGS=tensorflow
مثل هذا البناء يتطلب libtensorflow
.
hercules --burndown --burndown-files --burndown-people --couples --shotness --devs [--people-dict=/path/to/identities]
labours -m all
يمتلك Hercules نظامًا إضافيًا ويسمح بإجراء تحليلات مخصصة. راجع PLUGINS.md.
hercules combine
هو الأمر الذي يجمع العديد من نتائج التحليل بتنسيق Protocol Buffers معًا.
hercules --burndown --pb https://github.com/go-git/go-git > go-git.pb
hercules --burndown --pb https://github.com/src-d/hercules > hercules.pb
hercules combine go-git.pb hercules.pb | labours -f pb -m burndown-project --resample M
لا يدعم YAML النطاق الكامل لأحرف Unicode وقد يثير المحلل labours
بعض الاستثناءات. قم بتصفية الإخراج من hercules
من خلال fix_yaml_unicode.py
لتجاهل هذه الأحرف المسيئة.
hercules --burndown --burndown-people https://github.com/... | python3 fix_yaml_unicode.py | labours -m people
تؤثر هذه الخيارات على جميع المؤامرات:
labours [--style=white|black] [--backend=] [--size=Y,X]
--style
يحدد النمط العام للحبكة (انظر labours --help
). --background
يغير خلفية الرسم لتكون إما بيضاء أو سوداء. --backend
يختار الواجهة الخلفية لـ Matplotlib. --size
يحدد حجم الشكل بالبوصة. الافتراضي هو 12,9
.
(مطلوب في نظام التشغيل macOS) يمكنك تثبيت الواجهة الخلفية الافتراضية لـ Matplotlib باستخدامها
echo "backend: TkAgg" > ~/.matplotlib/matplotlibrc
تكون هذه الخيارات فعالة في المخططات المتوقفة فقط:
labours [--text-size] [--relative]
--text-size
يغير حجم الخط، --relative
يقوم بتنشيط التخطيط المحترق الممتد.
من الممكن إخراج جميع المعلومات اللازمة لرسم المخططات بتنسيق JSON. ما عليك سوى إلحاق .json
بالمخرج ( -o
) وبذلك تكون قد انتهيت. لم يتم تحديد تنسيق البيانات بشكل كامل ويعتمد على كود Python الذي يقوم بإنشائه. يجب أن يحتوي كل ملف JSON على "type"
يعكس نوع الرسم.
--first-parent
كحل بديل.hercules
لنواة Linux في وضع "الأزواج" 1.5 جيجابايت ويستغرق تحليله أكثر من ساعة/180 جيجابايت من ذاكرة الوصول العشوائي. ومع ذلك، يتم تحليل معظم المستودعات في غضون دقيقة واحدة. حاول استخدام Protocol Buffers بدلاً من ذلك ( hercules --pb
و labours -f pb
). # Debian, Ubuntu
apt install libyaml-dev
# macOS
brew install yaml-cpp libyaml
# you might need to re-install pyyaml for changes to make effect
pip uninstall pyyaml
pip --no-cache-dir install pyyaml
إذا كان المستودع الذي تم تحليله كبيرًا ويستخدم التفريع على نطاق واسع، فقد تفشل مجموعة إحصائيات الإيقاف مع OOM. يجب عليك تجربة ما يلي:
--skip-blacklist
لتجنب تحليل الملفات غير المرغوب فيها. من الممكن أيضًا تقييد --language
.--hibernation-distance 10 --burndown-hibernation-threshold=1000
. العب بهذين الرقمين لبدء السبات قبل OOM مباشرة.--burndown-hibernation-disk --burndown-hibernation-dir /path
.--first-parent
، أنت تفوز. src-d/go-git
إلى go-git/go-git
. قم بترقية قاعدة التعليمات البرمجية لتكون متوافقة مع أحدث إصدار من Go.