在 Git 中编写一个预推送挂钩以 grep regex 的所有文件想要在找不到 regex 时拒绝推送
Writing a pre-push hook in Git to grep all files for regex want to reject push if regex not found
我有以下预推钩子。理想情况下,我希望它遍历所有被推送到我的存储库的文件,如果任何文件的内容与顶部定义的正则表达式不匹配,则拒绝推送。尝试遍历文件时出现以下错误:"undefined method `each' for "":String (NoMethodError)"。 '.each' 不起作用,因为 git 命令返回包含已更改文件的字符串。
#!/usr/bin/env ruby
regex = "\s*GO\s*$"
localRef, remoteRef = ARGV
#puts localRef
#puts remoteRef
input = $stdin.readlines[0]
localSha = input.split(" ")[1]
remoteSha = input.split(" ")[3]
#puts localSha
#puts remoteSha
range = "#{remoteSha}..#{localSha}"
#folderPath = `git rev-parse --show-toplevel`
#puts folderPath
`git diff --name-only --diff-filter=ACMR #{range}`.each do |file|
#puts file
content = File.read(file)
unless content.match(regex)
puts "#{file} must end with 'GO' keyword"
exit 1
end
end
exit 0
有谁知道我如何循环返回的文件?
谢谢
只需要使用“.each_line”而不是“.each”。
我有以下预推钩子。理想情况下,我希望它遍历所有被推送到我的存储库的文件,如果任何文件的内容与顶部定义的正则表达式不匹配,则拒绝推送。尝试遍历文件时出现以下错误:"undefined method `each' for "":String (NoMethodError)"。 '.each' 不起作用,因为 git 命令返回包含已更改文件的字符串。
#!/usr/bin/env ruby
regex = "\s*GO\s*$"
localRef, remoteRef = ARGV
#puts localRef
#puts remoteRef
input = $stdin.readlines[0]
localSha = input.split(" ")[1]
remoteSha = input.split(" ")[3]
#puts localSha
#puts remoteSha
range = "#{remoteSha}..#{localSha}"
#folderPath = `git rev-parse --show-toplevel`
#puts folderPath
`git diff --name-only --diff-filter=ACMR #{range}`.each do |file|
#puts file
content = File.read(file)
unless content.match(regex)
puts "#{file} must end with 'GO' keyword"
exit 1
end
end
exit 0
有谁知道我如何循环返回的文件?
谢谢
只需要使用“.each_line”而不是“.each”。