Если вы ищете встроенное решение, я не знаю ни одного. Однако это не означает, что это не может быть относительно легко встроено в систему CI.
Вы можете перенаправить вывод соответствующей команды git diff
в скрипт, подобный следующему, который будет выходить из 1, если кормил патч, содержащий кусок, как второй выше.
#!/usr/bin/env ruby
def filter(arr)
arr.join.split("\n\n").map { |x| x.gsub(/\s+/, ' ') }.join("\n\n")
end
def should_reject(before, after)
return false if before.empty? && after.empty?
before = filter(before)
after = filter(after)
return true if before == after
false
end
chunk = nil
before = []
after = []
while (line = gets)
trimmed = line[1..-1]
case line
when /^(\+\+\+|---)/
# Do nothing.
when /^@@ /
if should_reject(before, after)
warn "Useless change to hunk #{chunk}"
exit 1
end
chunk = line
before = []
after = []
when /^ /
before << trimmed
after << trimmed
when /^\+/
after << trimmed
when /^-/
before << trimmed
end
end
if should_reject(before, after)
warn "Useless change to hunk #{chunk}"
exit 1
end
Он по существу разбивает каждый кусок на куски с пустой строкой между ними, превращает все пробелы в пробелы, а затем сравнивает их. Если они равны, он жалуется и выходит ненулевой. Вы можете sh изменить его, чтобы сделать его более надежным, например, иметь дело с окончаниями CRLF или чем-то подобным, но этот подход жизнеспособен.
В качестве примечания: один из подходов, облегчающий обнаружение таких изменений это использовать стиль предложения на строку. Каждое предложение, независимо от длины, находится в одной целой строке, и в каждой строке есть только одно предложение. Это значительно упрощает распространение любых изменений и позволяет избежать проблем с переносом.