Analisis riwayat Git yang cepat, berwawasan luas, dan sangat dapat disesuaikan.
Ikhtisar • Cara Menggunakan • Instalasi • Kontribusi • Lisensi
Hercules adalah mesin analisis repositori Git yang luar biasa cepat dan dapat disesuaikan, ditulis dalam Go. Baterai sudah termasuk. Didukung oleh go-git.
Pemberitahuan (November 2020): penulis utama telah kembali dari ketidakpastian dan secara bertahap melanjutkan pengembangan. Lihat peta jalan.
Ada dua alat baris perintah: hercules
dan labours
. Yang pertama adalah program yang ditulis dalam Go yang mengambil repositori Git dan mengeksekusi tugas analisis Directed Acyclic Graph (DAG) sepanjang riwayat penerapan penuh. Yang kedua adalah skrip Python yang menampilkan beberapa plot yang telah ditentukan sebelumnya atas data yang dikumpulkan. Kedua alat ini biasanya digunakan bersamaan melalui sebuah pipa. Dimungkinkan untuk menulis analisis khusus menggunakan sistem plugin. Dimungkinkan juga untuk menggabungkan beberapa hasil analisis menjadi satu - relevan untuk organisasi. Riwayat komit yang dianalisis mencakup cabang, penggabungan, dll.
Hercules telah berhasil digunakan untuk beberapa proyek internal di sumber{d}. Ada posting blog: 1, 2 dan presentasi. Silakan berkontribusi dengan menguji, memperbaiki bug, menambahkan analisis baru, atau membuat kode yang angkuh!
DAG dari burndown dan analisis pasangan dengan pemurnian perbedaan UAST. Dihasilkan dengan hercules --burndown --burndown-people --couples --feature=uast --dry-run --dump-dag doc/dag.dot https://github.com/src-d/hercules
pembakaran baris torvalds/linux (perincian 30, pengambilan sampel 30, pengambilan sampel ulang berdasarkan tahun). Dihasilkan dengan hercules --burndown --first-parent --pb https://github.com/torvalds/linux | labours -f pb -m burndown-project
dalam 1 jam 40 menit.
Ambil biner hercules
dari halaman Rilis. labours
dapat diinstal dari PyPi:
pip3 install labours
pip3
adalah manajer paket Python.
Numpy dan Scipy dapat diinstal di Windows menggunakan http://www.lfd.uci.edu/~gohlke/pythonlibs/
Anda memerlukan Go (>= v1.11) dan protoc
.
git clone https://github.com/src-d/hercules && cd hercules
make
pip3 install -e ./python
Dimungkinkan untuk menjalankan Hercules sebagai Tindakan GitHub: Hercules di GitHub Marketplace. Silakan merujuk ke contoh alur kerja yang menunjukkan cara menyiapkan.
... selamat datang! Lihat KONTRIBUSI dan kode etik.
Apache 2.0
Referensi baris perintah terkini yang paling berguna dan andal:
hercules --help
Beberapa contoh:
# 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
memungkinkan untuk membaca output dari hercules
yang disimpan di disk.
Dimungkinkan untuk menyimpan repositori yang dikloning pada disk. Analisis selanjutnya dapat dijalankan pada direktori yang sesuai alih-alih mengkloning dari awal:
# First time - cache
hercules https://github.com/git/git /tmp/repo-cache
# Second time - use the cache
hercules --some-analysis /tmp/repo-cache
Tindakan tersebut menghasilkan artefak bernama hercules_charts
. Karena saat ini tidak mungkin mengemas beberapa file dalam satu artefak, semua bagan dan file Proyektor Tensorflow dikemas dalam arsip tar bagian dalam. Untuk melihat penyematan, buka proyektor.tensorflow.org, klik "Muat" dan pilih dua TSV. Kemudian gunakan UMAP atau 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
Statistik burndown baris untuk seluruh repositori. Persis sama dengan apa yang dilakukan git-of-theseus tetapi jauh lebih cepat. Menyalahkan dilakukan secara efisien dan bertahap menggunakan algoritma pelacakan pohon RB khusus, dan hanya tanggal modifikasi terakhir yang dicatat saat menjalankan analisis.
Semua analisis burndown bergantung pada nilai granularitas dan sampling . Granularitas adalah jumlah hari yang dimiliki setiap band dalam tumpukan. Pengambilan sampel adalah frekuensi pengambilan cuplikan status burnout. Semakin kecil nilainya, semakin halus plotnya namun semakin banyak pekerjaan yang dilakukan.
Ada opsi untuk mengambil sampel ulang pita di dalam labours
, sehingga Anda dapat menentukan distribusi yang sangat tepat dan memvisualisasikannya dengan cara yang berbeda. Selain itu, pengambilan sampel ulang menyelaraskan pita melintasi batas-batas periodik, misalnya bulan atau tahun. Band-band yang belum diresampling ternyata tidak selaras dan dimulai dari tanggal lahir proyek tersebut.
hercules --burndown --burndown-files
labours -m burndown-file
Statistik burndown untuk setiap file di repositori yang aktif di revisi terbaru.
Catatan: ini akan menghasilkan grafik terpisah untuk setiap file. Anda tidak ingin menjalankannya di repositori dengan banyak file.
hercules --burndown --burndown-people [--people-dict=/path/to/identities]
labours -m burndown-person
Statistik burndown untuk kontributor repositori. Jika --people-dict
tidak ditentukan, identitas ditemukan dengan algoritma berikut:
Jika --people-dict
ditentukan, itu harus mengarah ke file teks dengan identitas khusus. Formatnya adalah: setiap baris adalah satu pengembang, berisi semua email dan nama yang cocok, dipisahkan oleh |
. Kasus ini diabaikan.
20 pengembang teratas Wireshark - menimpa matriks
hercules --burndown --burndown-people [--people-dict=/path/to/identities]
labours -m overwrites-matrix
Selain informasi burndown, --burndown-people
mengumpulkan statistik baris yang ditambahkan dan dihapus per pengembang. Dengan demikian dapat divisualisasikan berapa banyak baris yang ditulis oleh pengembang A yang dihapus oleh pengembang B. Hal ini menunjukkan kolaborasi antar orang dan menentukan tim keahlian.
Formatnya adalah matriks dengan N baris dan (N+2) kolom, dimana N adalah jumlah pengembang.
--people-dict
tidak ditentukan, selalu 0). Urutan pengembang disimpan di node YAML people_sequence
.
20 pengembang teratas Ember.js - kepemilikan kode
hercules --burndown --burndown-people [--people-dict=/path/to/identities]
labours -m ownership
--burndown-people
juga memungkinkan untuk menggambar pembagian kode melalui plot area bertumpuk waktu. Artinya, berapa banyak garis yang hidup pada momen sampel untuk setiap pengembang yang diidentifikasi.
penggabungan file torvalds/linux di Proyektor Tensorflow
hercules --couples [--people-dict=/path/to/identities]
labours -m couples -o <name> [--couples-tmp-dir=/tmp]
Penting : Tensorflow perlu diinstal, harap ikuti instruksi resmi.
File-file tersebut digabungkan jika diubah dalam komit yang sama. Pengembang digabungkan jika mereka mengubah file yang sama. hercules
mencatat jumlah pasangan di seluruh riwayat penerapan dan menghasilkan dua matriks kejadian bersama yang sesuai. labours
kemudian melatih Swivel embeddings - vektor padat yang mencerminkan probabilitas kejadian bersama melalui jarak Euclidean. Pelatihan ini memerlukan instalasi Tensorflow yang berfungsi. File perantara disimpan dalam direktori sementara sistem atau --couples-tmp-dir
jika ditentukan. Penyematan yang dilatih ditulis ke direktori kerja saat ini dengan nama yang bergantung pada -o
. Format keluarannya adalah TSV dan cocok dengan Tensorflow Projector sehingga file dan orang dapat divisualisasikan dengan t-SNE yang diimplementasikan di 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]
Berkat Babelfish, Hercules dapat mengukur berapa kali setiap unit struktural telah dimodifikasi. Secara default, ini melihat fungsi; lihat manual Semantic UAST XPath untuk beralih ke sesuatu yang lain.
hercules --shotness [--shotness-xpath-*]
labours -m shotness
Analisis pasangan secara otomatis memuat data "shotness" jika tersedia.
hercules --shotness --pb https://github.com/pallets/jinja | labours -m couples -f pb
tensorflow/tensorflow menyelaraskan rangkaian penerapan 50 pengembang teratas berdasarkan nomor penerapan.
hercules --devs [--people-dict=/path/to/identities]
labours -m devs -o <name>
Kami mencatat berapa banyak komitmen yang dibuat, serta baris yang ditambahkan, dihapus, dan diubah per hari untuk setiap pengembang. Kami memplot rangkaian waktu penerapan yang dihasilkan menggunakan beberapa trik untuk menunjukkan pengelompokan temporal. Dengan kata lain, dua rangkaian penerapan yang berdekatan akan terlihat serupa setelah normalisasi.
Plot ini memungkinkan untuk mengetahui bagaimana tim pengembangan berkembang seiring berjalannya waktu. Itu juga menunjukkan "komit flashmob" seperti Hacktoberfest. Misalnya, berikut adalah wawasan yang terungkap dari plot tensorflow/tensorflow
di atas:
tensorflow/tensorflow menambahkan dan mengubah garis seiring waktu.
hercules --devs [--people-dict=/path/to/identities]
labours -m old-vs-new -o <name>
--devs
dari bagian sebelumnya memungkinkan untuk memplot berapa banyak baris yang ditambahkan dan berapa banyak yang diubah (dihapus atau diganti) seiring berjalannya waktu. Plot ini dihaluskan.
upaya kubernetes/kubernetes sepanjang waktu.
hercules --devs [--people-dict=/path/to/identities]
labours -m devs-efforts -o <name>
Selain itu, --devs
memungkinkan untuk memplot berapa banyak baris yang telah diubah (ditambahkan atau dihapus) oleh masing-masing pengembang. Bagian atas petak merupakan bagian bawah yang terakumulasi (terintegrasi). Tidak mungkin memiliki skala yang sama untuk kedua bagian, sehingga nilai yang lebih rendah akan diskalakan, dan karenanya tidak ada titik sumbu Y yang lebih rendah. Terdapat perbedaan antara petak usaha dan petak kepemilikan, meskipun perubahan galur berkorelasi dengan galur kepemilikan.
Terlihat jelas bahwa komentar Django awalnya positif/optimis, namun kemudian menjadi negatif/pesimis.
hercules --sentiment --pb https://github.com/django/django | labours -m sentiment -f pb
Kami mengekstrak komentar baru dan yang diubah dari kode sumber pada setiap penerapan, menerapkan jaringan saraf berulang sentimen tujuan umum BiDiSentiment, dan memplot hasilnya. Membutuhkan libtensorflow. Misalnya sadly, we need to hide the rect from the documentation finder for now
negatif dan Theano has a built-in optimization for logsumexp (...) so we can just write the expression directly
positif. Namun jangan berharap terlalu banyak - seperti yang telah ditulis, model sentimen bertujuan umum dan komentar kode memiliki sifat yang berbeda, jadi tidak ada keajaiban (untuk saat ini).
Hercules harus dibuat dengan tag "tensorflow" - ini bukan secara default:
make TAGS=tensorflow
Pembangunan seperti itu memerlukan libtensorflow
.
hercules --burndown --burndown-files --burndown-people --couples --shotness --devs [--people-dict=/path/to/identities]
labours -m all
Hercules memiliki sistem plugin dan memungkinkan untuk menjalankan analisis khusus. Lihat PLUGIN.md.
hercules combine
adalah perintah yang menggabungkan beberapa hasil analisis dalam format Protocol Buffers menjadi satu.
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 tidak mendukung keseluruhan karakter Unicode dan parser di sisi labours
dapat memunculkan pengecualian. Filter keluaran dari hercules
melalui fix_yaml_unicode.py
untuk membuang karakter yang menyinggung tersebut.
hercules --burndown --burndown-people https://github.com/... | python3 fix_yaml_unicode.py | labours -m people
Opsi berikut memengaruhi semua plot:
labours [--style=white|black] [--backend=] [--size=Y,X]
--style
menetapkan gaya umum plot (lihat labours --help
). --background
mengubah latar belakang plot menjadi putih atau hitam. --backend
memilih backend Matplotlib. --size
mengatur ukuran gambar dalam inci. Standarnya adalah 12,9
.
(diperlukan di macOS) Anda dapat menyematkan backend Matplotlib default
echo "backend: TkAgg" > ~/.matplotlib/matplotlibrc
Opsi berikut hanya efektif pada grafik burndown:
labours [--text-size] [--relative]
--text-size
mengubah ukuran font, --relative
mengaktifkan tata letak burndown yang diregangkan.
Dimungkinkan untuk mengeluarkan semua informasi yang diperlukan untuk menggambar plot dalam format JSON. Cukup tambahkan .json
ke output ( -o
) dan selesai. Format data tidak sepenuhnya ditentukan dan bergantung pada kode Python yang menghasilkannya. Setiap file JSON harus berisi "type"
yang mencerminkan jenis plot.
--first-parent
sebagai solusinya.hercules
untuk kernel Linux dalam mode "pasangan" adalah 1,5 GB dan memerlukan waktu lebih dari satu jam / 180 GB RAM untuk diuraikan. Namun, sebagian besar repositori diurai dalam satu menit. Coba gunakan Protocol Buffer sebagai gantinya ( hercules --pb
dan 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
Jika repositori yang dianalisis berukuran besar dan banyak menggunakan percabangan, pengumpulan statistik burndown mungkin gagal dengan OOM. Anda harus mencoba yang berikut ini:
--skip-blacklist
untuk menghindari analisis file yang tidak diinginkan. Dimungkinkan juga untuk membatasi --language
.--hibernation-distance 10 --burndown-hibernation-threshold=1000
. Mainkan dua angka tersebut untuk mulai berhibernasi tepat sebelum OOM.--burndown-hibernation-disk --burndown-hibernation-dir /path
.--first-parent
, kamu menang. src-d/go-git
ke go-git/go-git
. Tingkatkan basis kode agar kompatibel dengan versi Go terbaru.