title: Gruntjs: How to make copy task to copy only changed files on watch
body: <p>So on grunt-contrib-watch plugin info page, there is an example on how to make jshint run only for changed file.</p>
  
  <pre class="lang-js prettyprint-override"><code>grunt.initConfig({
    watch: {
      scripts: {
        files: ['lib/*.js'],
        tasks: ['jshint'],
        options: {
          nospawn: true,
        },
      },
    },
    jshint: {
      all: ['lib/*.js'],
    },
  });
  
  grunt.event.on('watch', function(action, filepath) {
    grunt.config(['jshint', 'all'], filepath);
  });
  </code></pre>
  
  <p>I have not tested example it self. But took this and applied to my copy task, unsuccessfully.
  grunt-contrib-copy task set up to copy images and templates for my angular project. And I would be happy to know if I can make this work for copy task and if I can, what am I doing wrong.</p>
  
  <p>Thank you so much.</p>
  
  <p>Here is my stripped out Gruntfile.js.</p>
  
  <pre class="lang-js prettyprint-override"><code>// Build configurations.
  module.exports = function(grunt){
  
    // Project configuration.
      grunt.initConfig({
  
        pkg: grunt.file.readJSON('package.json'),
  
        // Copies directories and files from one location to another.
        copy: {
          // DEVELOPMENT
          devTmpl: {
            files: [{
              cwd     : 'src/tpl/',
              src     : ['**/*'], 
              dest    : 'app/tpl/',
              flatten : false,
              expand  : true
            }]
          },
          devImg: {
            files: [{
              cwd     : 'src/img/',
              src     : ['**/*'], 
              dest    : 'app/img/', 
              flatten : false,
              expand  : true
            }]
          }
        },
  
        // Watch files for changes and run tasks 
        watch: {
          // Templates, copy
          templates: {
            files : 'src/tpl/**/*',
            tasks : ['copy:devTmpl'],
            options: {
              nospawn: true,
            }
          },
          // Images, copy
          images: {
            files : 'src/img/**/*',
            tasks : ['copy:devImg'],
            options: {
              nospawn: true,
            }
          }
        }
  
      });
  
    // Watch events
      grunt.event.on('watch', function(action, filepath) {
        // configure copy:devTmpl to only run on changed file
        grunt.config(['copy','devTmpl'], filepath);
        // configure copy:devImg to only run on changed file
        grunt.config(['copy','devImg'], filepath);
      });
  
    // PLUGINS:
      grunt.loadNpmTasks('grunt-contrib-copy');
  
  
    // TASKS:
  
      /* DEV: Compiles the app with non-optimized build settings, places the build artifacts in the dist directory, and watches for file changes.
      run: grunt dev */
      grunt.registerTask('dev', 'Running "DEVELOPMENT", watching files and compiling...', [
        'default',
        'watch'
      ]);
  
      /* DEFAULT: Compiles the app with non-optimized build settings and places the build artifacts in the dist directory.
      run: grunt */
      grunt.registerTask('default', 'Running "DEFAULT", compiling everything.', [
        'copy:devTmpl',
        'copy:devImg'
      ]);
  
  }
  </code></pre>