我有一个在Ruby脚本中编辑过的Android XML(字符串)文件。我想列出并输出当时所做的更改。我已经用Nokogiri和nokogiri/diff
尝试过。但却没有理想的结果。
当在中间添加新行时,我也感到它有问题。总而言之,如果可以使用git diff
,我认为这是最简单的。
我也找到了ruby-git宝石,但我仍然无法使它正常工作。特别是因为我只需要特定文件的差异。
require 'git'
Git.configure do |config|
#not sure if I actually need something?
end
g = Git.open(path_to_my_dir, :log => Logger.new(STDOUT))
g.diff(path_to_file)
#or
g.diff().path(path_to_file)
有人可以帮我吗? :-(
答案 0 :(得分:2)
您认为方向正确。
为此目的使用
require 'git'
g = Git.open('path/to/dir')
g.diff('your.file').patch #=> changes in your.file
例如,我们的git-repo中有git.rb
和smth
空文件。
然后我们更改它们并检查差异:
$ git diff
diff --git a/git.rb b/git.rb
index e69de29..3ff224d 100644
--- a/git.rb
+++ b/git.rb
@@ -0,0 +1,3 @@
+require 'git'
+g = Git.open(__dir__)
+puts g.diff('smth').patch
diff --git a/smth b/smth
index e69de29..7c5bd35 100644
--- a/smth
+++ b/smth
@@ -0,0 +1 @@
+we want to know changes
从修改后的git.rb
中已经猜到,现在我们将仅在smth
中看到更改:
$ ruby git.rb
diff --git a/smth b/smth
index e69de29..7c5bd35 100644
--- a/smth
+++ b/smth
@@ -0,0 +1 @@
+we want to know changes
如果没有更改,您将获得空字符串""
。
答案 1 :(得分:1)
您可能想直接使用McIlroy-Hunt最长公共子序列(LCS)算法,而不是使用它的派生/包装器。
请参见https://github.com/halostatue/diff-lcs
如果您比较a与b的变化而不是b与a的变化,差异将发生变化,但是您当然可以针对数组或针对整个文件运行差异。
如果您更喜欢使用gem而不是直接使用它的直接输出,gem还具有经典的diff工具格式(由diff或git使用)。