用 julia 的 LibGit2 做一个 `git diff`
make a `git diff` with julia's LibGit2
我正在尝试为另一个安装了 julia 但未安装 git 的人调试问题。我想知道对 julia 包进行了哪些更改,所以本质上是命令 git diff
。
我想知道是否可以为此使用 LibGit2?这些命令让我很接近:
repo = LibGit2.GitRepo(Pkg.dir("NCDatasets"))
tree = LibGit2.GitTree(repo,"HEAD^{tree}");
diff = LibGit2.diff_tree(repo,tree,"")
他们return:
GitDiff:
Number of deltas: 1
GitDiffStats:
Files changed: 1
Insertions: 1
Deletions: 1
假设我想知道包 NCDatasets 中的变化。
所以我知道有一个文件被更改了。我怎么知道这个文件是哪一个以及如何更改的?
不幸的是,根据我从这里的理解,我没有得到任何进一步的信息:
https://github.com/JuliaLang/julia/blob/master/stdlib/LibGit2/src/diff.jl
https://github.com/JuliaLang/julia/blob/master/stdlib/LibGit2/test/libgit2.jl
您可以使用:
julia> for i in 1:count(diff)
d = diff[i];print(d)
println(unsafe_string(d.old_file.path), "\t",
unsafe_string(d.new_file.path),"\n---\n")
end
这将为您打印 diff
的每个条目。不幸的是,DiffFile
的标准 print
不打印文件名,因此我在标准打印下方添加了打印。
但是请注意,此 diff
将不包含未跟踪的文件。捕获它们的最简单方法是使用 LibGit2.status
函数并使用 walkdir
遍历存储库中的所有文件。此方法也有其缺点,因为它不会检测 diff
将包含的已删除文件。通过结合这两种方法,应该可以编写一个捕获所有情况的函数。
我正在尝试为另一个安装了 julia 但未安装 git 的人调试问题。我想知道对 julia 包进行了哪些更改,所以本质上是命令 git diff
。
我想知道是否可以为此使用 LibGit2?这些命令让我很接近:
repo = LibGit2.GitRepo(Pkg.dir("NCDatasets"))
tree = LibGit2.GitTree(repo,"HEAD^{tree}");
diff = LibGit2.diff_tree(repo,tree,"")
他们return:
GitDiff:
Number of deltas: 1
GitDiffStats:
Files changed: 1
Insertions: 1
Deletions: 1
假设我想知道包 NCDatasets 中的变化。
所以我知道有一个文件被更改了。我怎么知道这个文件是哪一个以及如何更改的?
不幸的是,根据我从这里的理解,我没有得到任何进一步的信息:
https://github.com/JuliaLang/julia/blob/master/stdlib/LibGit2/src/diff.jl
https://github.com/JuliaLang/julia/blob/master/stdlib/LibGit2/test/libgit2.jl
您可以使用:
julia> for i in 1:count(diff)
d = diff[i];print(d)
println(unsafe_string(d.old_file.path), "\t",
unsafe_string(d.new_file.path),"\n---\n")
end
这将为您打印 diff
的每个条目。不幸的是,DiffFile
的标准 print
不打印文件名,因此我在标准打印下方添加了打印。
但是请注意,此 diff
将不包含未跟踪的文件。捕获它们的最简单方法是使用 LibGit2.status
函数并使用 walkdir
遍历存储库中的所有文件。此方法也有其缺点,因为它不会检测 diff
将包含的已删除文件。通过结合这两种方法,应该可以编写一个捕获所有情况的函数。