Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby解析特定文件的git diff?_Ruby_Git - Fatal编程技术网

如何使用Ruby解析特定文件的git diff?

如何使用Ruby解析特定文件的git diff?,ruby,git,Ruby,Git,我有一个用Ruby脚本编辑的Android XML(字符串)文件。我想列出并输出当时所做的更改。我已经用Nokogiri和Nokogiri/diff试过了。但它没有达到预期的效果 我也觉得当它中间有一条新的线时,它就有问题了。总之,我想如果我能使用git diff,这将是最简单的 我也找到了gem,但我仍然无法让它工作。特别是因为我只需要一个特定文件的diff require 'git' Git.configure do |config| #not sure if I actually ne

我有一个用Ruby脚本编辑的Android XML(字符串)文件。我想列出并输出当时所做的更改。我已经用Nokogiri和
Nokogiri/diff
试过了。但它没有达到预期的效果

我也觉得当它中间有一条新的线时,它就有问题了。总之,我想如果我能使用
git diff
,这将是最简单的

我也找到了gem,但我仍然无法让它工作。特别是因为我只需要一个特定文件的diff

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)

谁能帮帮我吗-(

你的想法是正确的

为此,请使用

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

如果没有更改,您将得到空字符串

您可能希望直接使用McIlroy Hunt最长公共子序列(LCS)算法,而不是使用它的派生/包装

如果您比较a与b的变化,而不是b与a的变化,则差异会发生变化,但您当然可以对数组或整个文件运行它


如果您愿意,gem还有经典的diff工具格式(diff或git使用),而不是直接输出。

嘿,我尝试了这个,因为它看起来非常简单。例如,我尝试了
g=git.open(“User/me/android项目”)
然后
g.diff(“fobber/src/main/res/values/strings.xml”).patch
但随后我收到一个错误,如:路径参数不明确:未知提交或路径在工作目录中不存在:-(我做错了什么?例如,您使用此scipt的文件位于
/home/user/smth
文件夹中。它将在
/home/user/smth/user/me/android project
中搜索git repo文件夹。这是因为您有错误谢谢您的帮助。它现在正在工作。问题是在我的脚本中,指向.git文件夹的路径是绝对路径。)不知怎的,我的文件路径刚刚开始在文件夹中的某个地方。我现在使用的是一个绝对路径,它正在工作。很好!