كيف يمكنني رسم بياني لتاريخ خطوط التعليمات البرمجية لـ git repo؟

StackOverflow https://stackoverflow.com/questions/23907

سؤال

أريد بشكل أساسي الحصول على عدد أسطر التعليمات البرمجية في المستودع بعد كل التزام.

الطرق الوحيدة (السيئة حقًا) التي وجدتها هي استخدامها git filter-branch يهرب wc -l *, ، والبرنامج النصي الذي يتم تشغيله git reset --hard على كل التزام، ثم يعمل wc -l

لجعل الأمر أكثر وضوحًا، عند تشغيل الأداة، ستخرج سطور التعليمات البرمجية الخاصة بالالتزام الأول، ثم الثاني وهكذا.هذا ما أريد أن تخرجه الأداة (كمثال):

me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542

لقد تلاعبت بمكتبة روبي "git"، ولكن أقرب ما وجدته هو استخدام .lines() الطريقة على فرق، والتي يبدو أنها يجب أن تعطي الأسطر المضافة (لكنها لا:ترجع 0 عند حذف الخطوط على سبيل المثال)

require 'rubygems'
require 'git'

total = 0
g = Git.open(working_dir = '/Users/dbr/Desktop/code_projects/tvdb_api')    

last = nil
g.log.each do |cur|
  diff = g.diff(last, cur)
  total = total + diff.lines
  puts total
  last = cur
end
هل كانت مفيدة؟

المحلول

قد تفكر أيضًا gitstats, ، الذي يقوم بإنشاء هذا الرسم البياني كملف HTML.

نصائح أخرى

يمكنك الحصول على الأسطر المضافة والمحذوفة باستخدام git log، مثل:

git log --shortstat --reverse --pretty=oneline

من هذا، يمكنك كتابة برنامج نصي مشابه لذلك الذي قمت به باستخدام هذه المعلومات.في بيثون:

#!/usr/bin/python

"""
Display the per-commit size of the current git branch.
"""

import subprocess
import re
import sys

def main(argv):
  git = subprocess.Popen(["git", "log", "--shortstat", "--reverse",
                        "--pretty=oneline"], stdout=subprocess.PIPE)
  out, err = git.communicate()
  total_files, total_insertions, total_deletions = 0, 0, 0
  for line in out.split('\n'):
    if not line: continue
    if line[0] != ' ': 
      # This is a description line
      hash, desc = line.split(" ", 1)
    else:
      # This is a stat line
      data = re.findall(
        ' (\d+) files changed, (\d+) insertions\(\+\), (\d+) deletions\(-\)', 
        line)
      files, insertions, deletions = ( int(x) for x in data[0] )
      total_files += files
      total_insertions += insertions
      total_deletions += deletions
      print "%s: %d files, %d lines" % (hash, total_files,
                                        total_insertions - total_deletions)


if __name__ == '__main__':
  sys.exit(main(sys.argv))

http://github.com/ITikhonov/git-loc عملت مباشرة خارج الصندوق بالنسبة لي.

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

بعد قولي هذا، يبدو أنه يمكنك الاحتفاظ بسجل لمعرفات الالتزام وأسطر التعليمات البرمجية المقابلة في هذا الالتزام.في ربط ما بعد الالتزام، بدءًا من مراجعة HEAD، اعمل بشكل عكسي (تفرع إلى عدة آباء إذا لزم الأمر) حتى تصل جميع المسارات إلى الالتزام الذي رأيته بالفعل من قبل.من المفترض أن يمنحك ذلك إجمالي أسطر التعليمات البرمجية لكل معرف التزام.

هل هذا يساعد أي شيء؟لدي شعور بأنني أساءت فهم شيء ما بشأن سؤالك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top