3

我正试图git add -p逃离红宝石。问题是这个命令显示部分文件并等待用户输入,可能会打开 git 编辑器。由于这个原因,执行系统命令的常规内核方法将不起作用。我尝试使用open3,这是我到目前为止得到的:

require "open3"
Open3.popen3("\git add -p #{files_to_add.join(" ")}") do |stdin, stdout, stderr, wait_thr|
end

我不知道该放什么,在互联网上也找不到任何线索。

有什么想法可以解决这个问题吗?

注意:我不想使用任何宝石

编辑: open3不工作。我现在正在试验pty. 这是我所拥有的:

require "pty"
begin
  PTY.spawn("\git add -p #{files_to_add.join(" ")}") do |r, w, pid|
    begin
      r.each { |line| print line }
    rescue Errno::EIO
    end
  end
rescue PTY::ChildExited => e
  puts "The child process exited!"
end

此代码打印要修补的第一个块,但随后 git 询问的“问题”(换句话说,标准输入提示)没有出现。我显然没有在上面的代码中打印它,但我似乎无法找到如何做到这一点。有任何想法吗?

4

1 回答 1

3

pty标准库模块内部(这里不需要 gem)是一个可以require调用的内部模块expect。它将添加一个期望方法IO.

你可能想要这样的东西:

require 'pty'
require 'expect'

PTY.spawn "git add -p" do |r, w, pid|
  w.sync = true
  r.expect ']? ' do |got|
    puts got
    puts 'responding with q'
    w.write "q\r"
    puts r.expect "\n", 9
  end
end
于 2013-12-15T20:13:53.953 回答