我正在尝试从git钩执行代码(commit-msg hook)中获取输入。但是Ruby无法在输入点停止。并且它执行代码好像输入就像一个puts语句一样。这是我尝试和失败的代码。
#!/usr/bin/env ruby
require 'open3'
def take_input_here
Open3.popen3("pwd", :chdir=>"/") {|stdin, stdout, stderr, thread|
p stdout.read.chomp #=> "/"
}
input_val = gets.chomp
puts input_val
puts 'Hellow World!'
end
take_input_here
puts "Commit Aborted."
Process.exit(1)
有人请帮助我接受这个交互式输入,或者建议我使用编写git钩的好语言。预先感谢。
大多数git挂钩都是由stdin运行的,要么来自git写入信息的管道,要么完全与终端断开了stdin。commit-msg
钩属于第二类。
您使用哪种语言没有关系: commit-msg
挂钩中读取stdin会立即看到EOF,因为stdin已连接到/dev/null
(Linux/unix)或NUL:
(Windows)。
在类似Unix的系统上,您可以尝试打开/dev/tty
。请注意,如果git是从没有 a的 a /dev/tty
(某些分离的过程,例如通过 cron
)或出于某些其他原因读取 /dev/tty
不好的地方,这可能会导致其他问题,这可能会导致其他问题,因此,请小心。