Git diff 文本内容获取方式

使用org.eclipse.jgit.diff;(org.eclipse.igit:org.eclipse.igit)

//以下是读取变更行
Git git = init(gitPath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
DiffFormatter df = new DiffFormatter(out);
// 设置比较器为忽略空白字符对比(Ignores all whitespace)
df.setDiffComparator(RawTextComparator.WS_IGNORE_ALL);
df.setRepository(git.getRepository());
df.format(diffEntry); // 打印文件差异具体内容
String diffText = new String(out.toByteArray(), "UTF-8");

public Git init(String remotePath) {
        String dirName = remotePath.replace("gitlab", "igit").replace("igit.58corp.com:", "igit.58corp.com/").split("igit.58corp.com/")[1].replace("/", "_").replace(".git", "").replace("http:", "https:");
        remotePath = remotePath.replace("http:", "https:");
        logger.debug("start git init:" + remotePath + "; " + dirName);
        // 设置远程服务器上的用户名和密码
        // 克隆代码库命令
        Git git = null;

        try {
            File localPath = new File(CoverageConstants.GIT_CODEBASE_ROOT + dirName);
            if (!localPath.exists()) {
                CloneCommand cloneCommand = Git.cloneRepository();
                git = cloneCommand.setURI(remotePath.replace("gitlab", "igit").replace("git@igit.58corp.com:", "https://igit.58corp.com/")) // 设置远程URI
                        //.setBranch("master") // 设置clone下来的分支
                        .setDirectory(localPath) // 设置下载存放路径
                        .setCredentialsProvider(usernamePasswordCredentialsProvider) // 设置权限验证
                        .call();
                git.fetch().setRemote("origin").setCredentialsProvider(usernamePasswordCredentialsProvider).call();
            } else {
                String URL = CoverageConstants.GIT_CODEBASE_ROOT + dirName + "/.git";
                git = Git.open(new File(URL));
                git.fetch().setRemote("origin").setCredentialsProvider(usernamePasswordCredentialsProvider).call();
            }

        } catch (TransportException e) {
            logger.error("init git error:" + remotePath + ":" + e.getMessage());
        } catch (IOException e) {
            logger.error("init git error:" + remotePath + ":" + e.getMessage());
        } catch (InvalidRemoteException e) {
            logger.error(e.getMessage());
        } catch (GitAPIException e) {
            logger.error("init git error:" + remotePath + ":" + e.getMessage());
        }
        logger.debug("init completed:");
        return git;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`git diff`命令用于比较当前工作目录下的文件与提交历史之间的差异。当你使用 `git diff` 并希望查看具体的行数变化,你可以结合其他选项一起使用。例如: ### 使用 `git diff` 默认情况下,`git diff` 可能只显示整体变更情况。如果你想要看到详细到每一行的变化,你可以加入一些特定选项来增强输出。 #### 查看具体更改行数 如果仅仅想通过 `git diff` 来获取具体改动行的数量,并不需要特别复杂的指令组合,通常直接运行 `git diff HEAD~1` 就可以比较最后一次提交和当前版本之间的差异。如果你想更精确地查看某个特定提交之间的差异,可以用 `git diff [commit]` 替换 `HEAD~1`。 然而,在实际操作中,你可能会想要将行更改数量单独提取出来,这时可以结合 `grep` 或其他工具帮助你计数。 ### 使用辅助命令提取行数 为了从 `git diff` 的输出结果中提取出具体的行数信息,你可以先运行 `git diff`,然后使用 `grep` 或其他脚本来处理输出内容并计算行数。下面是一个简单的步骤示例: 1. **运行`git diff`**:首先使用 `git diff` 指令获取两个提交之间的差异。 ```bash git diff HEAD~1 ``` 2. **处理输出**:然后你可以将上述输出传递给 `grep` 或其他程序,过滤出需要的信息。例如,如果你只想关注新增或修改的行,则可以使用正则表达式匹配。 - 对于新增行,可以使用类似 `^` 表示开始符的模式。不过需要注意的是,直接通过 `git diff` 输出很难准确地仅列出新增行,因为 `git diff` 默认会显示出所有修改过的行。你需要额外处理这个输出,如使用 `awk`, `sed`, 或 `perl` 等脚本语言来分析输出内容。 ```bash # 示例使用 awk 分析 git diff 的输出 git diff HEAD~1 | awk '/^[+-]/ {print $0}' ``` 上述命令会在 `git diff` 的输出中查找以 `-` 或 `+` 开头的行,即表示删除或添加的行,并打印出来。请注意,这可能并不能准确地提供每个修改行的确切位置信息,而是作为一个大致的方法来展示行更改的状态。 3. **进一步分析**:为了精确统计每行的具体修改情况(比如增加、减少等),你可能需要对上述结果进行更多的文本处理或使用专门的脚本或工具进行分析。 ### 相关问题: 1. 如何使用 `git blame` 跟踪单行的修改者和修改时间? 2. `git log` 和 `git diff` 有何区别以及如何结合起来使用? 3. 当项目非常大时如何高效地使用 `git diff` 进行对比?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值