一、背景:

需要对当前公司所有的项目进行代码行数的统计

二、 可实现方式

1.脚本:通过git脚本将所有的项目拉下来并然后通过进行代码行数的统计

样例:

echo 创建项目对应的文件夹mkdir 项目名称echo 切到创建的文件夹中cd 项目名称echo 进行git初始化git initecho 添加远程仓库git remote add origin 项目地址git fetch origingit checkout -b master origin/masterecho 切换检出的分支为mastergit branchecho 拉取项目代码git pull origin masterecho  将项目名称追加输出到上级目录的projectCount.txt文件中注意逗号分隔echo 项目名称, >> ../projectCount.txtecho 使用git命令统计该项目的代码行数并将结果追加到上级目录的projectCount.txt文件中git ls-files | xargs cat | wc -l >> ../projectCount.txtcd ..echo 创建项目对应的文件夹mkdir 项目名称...将该代码保存成sh脚本,在gitbash命令行执行

将所有的项目进行脚本处理之后便可以得到一张项目名称,代码行数的txt文件,因为以逗号分隔故转换成csv文件后可以复制到excel中进行统计排序处理

2.gitlab提供的有标准的API接口可以通过调用API的方式进行统计

在网上进行一番的搜索发现已经有封装好的SDK包添加maven依赖后可以直接使用

样例:

引入maven依赖,如果需要其他的版本可以到github上面找到对应的版本:https://github.com/gitlab4j/gitlab4j-api

<!--        gitlab-api SDK-->        <dependency>            <groupId>org.gitlab4j</groupId>            <artifactId>gitlab4j-api</artifactId>            <version>5.3.0</version>        </dependency>

统计所有项目的代码行数:

    private String url = "gitlab的仓库地址";    private String authToken = "用户的token";    private GitLabApi gitLabAPI = new GitLabApi(url, authToken);    /**     * 统计每个项目的代码行数     *     * @throws Exception     */    @Test    public void codeTotalCount() throws Exception {        //拉取属于我的所有项目        List projectList = gitLabAPI.getProjectApi().getOwnedProjects();        for (Project proj : projectList) {            String namespace = proj.getNamespace().getFullPath();            String name = proj.getPath();            String url = proj.getWebUrl();            log.info("项目命名空间:{}, 项目名称:{}, 项目地址:{}", namespace, name, url);            //获取项目信息包含statistics信息            Project project = gitLabAPI.getProjectApi().getProject(namespace, name, true);            ProjectStatistics projectStatistics = project.getStatistics();            Long totalLines = projectStatistics.getRepositorySize();            log.info("项目名称:{}, 代码行数:{}", name, totalLines);        }    }

统计某一段时间人员的代码行数:

    private String url = "gitlab仓库地址";    private String authToken = "用户的token";    private GitLabApi gitLabAPI = new GitLabApi(url, authToken);    /**     * 统计人员某段时间的代码行数     *     * @throws Exception     */    @Test    public void codeAuthorCount() throws Exception {        gitLabAPI.enableRequestResponseLogging(Level.ALL);        List projectList = gitLabAPI.getProjectApi().getOwnedProjects();        //获取项目中的人员信息        List userList = getMembers("in");        log.info("查询人员列表:{}", JSON.toJSONString(userList));        Date start = DateUtil.parse("2023-07-01 00:00:00", "yyyy-MM-dd HH:mm:ss");        Date end = DateUtil.parse("2023-10-01 00:00:00", "yyyy-MM-dd HH:mm:ss");        for (User user : userList) {            Integer addCode = 0;            Integer delCode = 0;            Integer totalCode = 0;            String name = user.getName();            String userName = user.getUsername();            String state = user.getState();            //检查用户信息,不符合要求的用户如 blocked 可进行跳过            if (checkUserInfo(name, state)) {                continue;            }            for (Project p : projectList) {                List commitList = gitLabAPI.getCommitsApi().getCommits(p.getId(), "master", start, end);                for (Commit commit : commitList) {                    //因commit信息中没有用户的memberId信息,每个人提交信息有些缺失故进行多次判断                    if (userName.contains(commit.getAuthorName()) ||                            commit.getCommitterEmail().contains(userName) ||                            commit.getAuthorEmail().contains(userName)) {                        Commit c = gitLabAPI.getCommitsApi().getCommit(p.getId(), commit.getShortId());                        //添加代码行数                        addCode += c.getStats().getAdditions();                        //删除代码行数                        delCode += c.getStats().getDeletions();                        //累计修改行数                        totalCode += c.getStats().getTotal();                    }                }            }            log.info("开始时间:{},结束时间:{},姓名:{}, 添加代码行数:{}, 删除代码行数:{}, 累计变更行数:{}", start, end, name, addCode, delCode, totalCode);        }    }    private boolean checkUserInfo(String name, String state) {        if (state.equals("blocked") ||                name.contains("产品部")         ) {            return true;        }        return false;    }        /**     * 获取项目与group中的人员信息     *     * @param groupPath     * @return     * @throws Exception     */    private List getMembers(String groupPath) throws Exception {        List userList = new ArrayList();        //获取所有组路径下的人员信息        List groupList = gitLabAPI.getGroupApi().getGroups();        List projectList = new ArrayList();        for (Group g : groupList) {            log.info("组名称:{}, 组路径:{}", g.getDescription(), g.getFullPath());            List members = gitLabAPI.getGroupApi().getMembers(g.getId());            projectList.addAll(gitLabAPI.getGroupApi().getProjects(g.getId()));            for (Member m : members) {                if (!checkMemberExist(userList, m)) {                    User user = gitLabAPI.getUserApi().getUser(m.getId());                    userList.add(user);                }            }        }        //获取所有Project的人员信息        for (Project project : projectList) {            String name = project.getPath();            Long id = project.getId();            log.info("项目名称:{}, 项目Id:{}", name, id);            List members = gitLabAPI.getProjectApi().getMembers(id);            for (Member m : members) {                if (!checkMemberExist(userList, m)) {                    User user = gitLabAPI.getUserApi().getUser(m.getId());                    userList.add(user);                }            }        }        return userList;    }    /**     * 判断人员是否已经存在     *     * @param userList     * @param m     * @return     */    private boolean checkMemberExist(List userList, Member m) {        for (User user : userList) {            if (user.getId().equals(m.getId())) {                return true;            }        }        return false;    }