Автор оригинала: Marcin Piczkowski.
Когда я начинаю новый проект, помимо изучения того, как его создавать и запускать, мне также нравится проверять, на что следует обратить внимание. Такие вещи, как:
- является ли код чистым и хорошо структурированным?
- существуют ли еще разработчики, написавшие код?
- какие части являются источником наибольшей головной боли?
Вы можете найти часть этой информации в инструментах статического анализа кода (например, для Java: FindBugs , PMD , CheckStyle или плагин IntelliJ Idea под названием SonarLint )
Все они анализируют текущее состояние исходного кода, но, похоже, вы можете получить много ценной информации из истории проекта.
Вы могли бы получить такую информацию, как:
- насколько интенсивна разработка, например, сколько людей работает над кодом и сколько линий производится за определенный промежуток времени.
- сколько написано кода, связанного с ошибками и функциями (при условии, что каждое сообщение о фиксации имеет разные теги для каждой функции и исправления ошибок)
- какие файлы чаще всего обновляются в контексте ошибки
- какие файлы обычно обновляются вместе
Уже есть некоторые инструменты, которые могут это сделать (см. раздел “Ссылки” ниже), но провести такой анализ самостоятельно относительно просто.
Здесь – это простое приложение, написанное на Java, которое, учитывая путь к репозиторию git, выводит список из 10 наиболее часто фиксируемых файлов вместе с количеством фиксаций.
Я использовал Библиотека JGit , которая является реализацией Git на Java.
Это работает так, что я получаю список коммитов для репозитория.
public static StreamgetCommits(Git git) throws GitAPIException { return StreamSupport.stream(git.log().call().spliterator(), false); }
Затем для каждой фиксации я ссылаюсь на дерево версий, в котором содержится информация обо всех файлах в этой редакции.
public static StreamgetRevTrees(Stream commitsStream) { return commitsStream .map(rev -> rev.getTree().getId()); }
Для каждого такого дерева я сравниваю его с деревом из предыдущего коммита и получаю разницу.
public static Listdiff(Git git, ObjectId newCommit, ObjectId oldCommit) throws IOException { DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream()); df.setRepository(git.getRepository()); return df.scan(newCommit, oldCommit); }
Я собираю список всех измененных файлов во всех фиксациях и в конце группирую их по пути к файлу и подсчитываю вхождения. Наконец, я сортирую их по наиболее часто встречающимся путям.
Например, когда вы запустите приложение в популярной ветке spring-framework master, вы получите результаты, как показано ниже:
... build.gradle - 1374 src/asciidoc/index.adoc - 444 spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java - 375 spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java - 374 spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java - 362 spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java - 332 spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java - 323 spring-web/src/main/java/org/springframework/http/HttpHeaders.java - 323 spring-web/src/main/java/org/springframework/web/client/RestTemplate.java - 320 spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java - 320
Исходя из этого, вы можете представить, на какие файлы следует обратить внимание в первую очередь. Затем вы, вероятно, захотите проверить, где они используются для детализации ковша в проекте.
Рекомендации:
- Рекомендации:
- Рекомендации:
- Рекомендации:
- Рекомендации:
Оригинал: “https://www.codementor.io/@marcinpiczkowski/learn-about-your-project-from-git-history-obn67hw0u”