nodegit获取所有暂存文件的diff
nodegit get diff of all staged files
NodeGit提供了一种简单的方法,可以在没有阶段性更改的情况下获得所有当前更改的差异:
import NodeGit, { Diff } from 'nodegit';
function getUnstagedChanges(path) {
const repo = await NodeGit.Repository.open(path);
const diff = await Diff.indexToWorkdir(repo, null, {
flags: Diff.OPTION.INCLUDE_UNTRACKED |
Diff.OPTION.RECURSE_UNTRACKED_DIRS
});
console.log(await diff.patches());
}
getUnstagedChanges();
是否有类似的解决方案来区分所有阶段的更改?
好的,我找到了一种方法,但在第一次提交之前它不会起作用:
import NodeGit, { Diff } from 'nodegit';
function getStagedChanges(path) {
const repo = await NodeGit.Repository.open(path);
const head = await repository.getHeadCommit();
if (!head) {
return [];
}
const diff = await Diff.treeToIndex(repo, await head.getTree(), null);
const patches = await diff.patches();
console.log(patches.map((patch) => patch.newFile().path()));
}
getStagedChanges();
奇怪的是,您没有看到阶段性更改,因为indexToWorkdir
的工作原理与git diff
完全相同,并且只显示阶段性更改。我写了一个例子,对我来说很有效。它在diff中显示暂存和未暂存的文件,请尝试一下。如果跳过选项,只显示暂存的文件。
还要注意将Diff.OPTION.INCLUDE_UNTRACKED
替换为Diff.OPTION.SHOW_UNTRACKED_CONTENT
import path from 'path';
import Git from 'nodegit';
async function print() {
const repo = await Git.Repository.open(path.resolve(__dirname, '.git'));
const diff = await Git.Diff.indexToWorkdir(repo, null, {
flags: Git.Diff.OPTION.SHOW_UNTRACKED_CONTENT | Git.Diff.OPTION.RECURSE_UNTRACKED_DIRS
});
// you can't simple log diff here, it logs as empty object
// console.log(diff); // -> {}
diff.patches().then((patches) => {
patches.forEach((patch) => {
patch.hunks().then((hunks) => {
hunks.forEach((hunk) => {
hunk.lines().then((lines) => {
console.log("diff", patch.oldFile().path(), patch.newFile().path());
console.log(hunk.header().trim());
lines.forEach((line) => {
console.log(String.fromCharCode(line.origin()) + line.content().trim());
});
});
});
});
});
});
return diff;
}
print().catch(err => console.error(err));
即使没有现有的提交,也可以使用空树(不包含任何内容的树的哈希)。
import { Repository, Tree, Diff } from 'nodegit';
const emptyTree = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
function getStagedChanges(path) {
const repo = await Repository.open(path);
const head = await repository.getHeadCommit();
const tree = await (head ? head.getTree() : Tree.lookup(repo, emptyTree));
const diff = await Diff.treeToIndex(repo, await head.getTree(), null);
const patches = await diff.patches();
console.log(patches.map((patch) => patch.newFile().path()));
}
getStagedChanges('/path/to/repo');
相关文章:
- 如何播放部分音频文件
- 从桌面读取python文件时高亮显示代码
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 如何使用WCF服务和javascript表单post上传.doc文件
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何在生成下载文件时显示加载动画
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 正在SharePoint 2013母版页中添加JQuery移动文件
- 如何在php文件中获取$.post-ajax传递的值
- 直接下载文件,而不是从window.open(url)
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 使用压缩的JavaScript文件(不是运行时压缩)
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- Javascript运行php文件,然后下载文件
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- nodegit获取所有暂存文件的diff
- 使用Javascript在浏览器中创建文本文件diff