Para os meus propósitos, como as alterações eram pequenas, era mais simples criar um arquivo zip contendo arquivos de substituição do que criar um patch. Dessa forma eu não tive que mexer com p-levels.
Para fazer isso, usei Beyond Compare , selecionei os arquivos alterados, copiei-os para um diretório com nome idêntico (com um caminho do pai), e zipou esse diretório com nome idêntico.
Para aplicá-lo, basta descompactá-lo sobre os arquivos existentes, substituindo todos.
Isso não detectará se as alterações são válidas ou não, ao contrário da resposta da RedGrittyBrick, que detectará isso , mas é mais simples de entender e funciona melhor para o meu cenário.
Também aconteceu que não precisei automatizar o processo. Se você fizer isso, existem maneiras de executar ferramentas de comparação a partir de um arquivo de lote, gerando uma lista de arquivos para zipar e usando um utilitário zip de linha de comando para armazenar o resultado.