title: grunt appending hash to dist/ files
body: <p><strong>TL;DR:</strong> How do i stop the hash from being appended to the dist/ files Thanks!</p>
  
  <p>Using yeoman (grunt + bower), I am trying to deploy my app to heroku. I can run the app in connect mode but the dist/ version of the app has a hash like 1d9f82a4.logo.png that is breaking my image links in my html. Here's my grunt file:</p>
  
  <pre><code>'use strict';
  var LIVERELOAD_PORT = 35729;
  var SERVER_PORT = 9000;
  var lrSnippet = require('connect-livereload')({port: LIVERELOAD_PORT});
  var mountFolder = function (connect, dir) {
      return connect.static(require('path').resolve(dir));
  };
  
  // # Globbing
  // for performance reasons we're only matching one level down:
  // 'test/spec/{,*/}*.js'
  // use this if you want to match all subfolders:
  // 'test/spec/**/*.js'
  // templateFramework: 'handlebars'
  
  module.exports = function (grunt) {
      // show elapsed time at the end
      require('time-grunt')(grunt);
      // load all grunt tasks
      require('load-grunt-tasks')(grunt);
  
      // configurable paths
      var yeomanConfig = {
          app: 'app',
          dist: 'heroku/dist'
      };
  
      grunt.initConfig({
          yeoman: yeomanConfig,
          watch: {
              options: {
                  nospawn: true,
                  livereload: true
              },
              coffee: {
                  files: ['&lt;%= yeoman.app %&gt;/scripts/{,*/}*.coffee'],
                  tasks: ['coffee:dist']
              },
              coffeeTest: {
                  files: ['test/spec/{,*/}*.coffee'],
                  tasks: ['coffee:test']
              },
              compass: {
                  files: ['&lt;%= yeoman.app %&gt;/styles/{,*/}*.{scss,sass}'],
                  tasks: ['compass']
              },
              livereload: {
                  options: {
                      livereload: LIVERELOAD_PORT
                  },
                  files: [
                      '&lt;%= yeoman.app %&gt;/*.html',
                      '{.tmp,&lt;%= yeoman.app %&gt;}/styles/{,*/}*.css',
                      '{.tmp,&lt;%= yeoman.app %&gt;}/scripts/{,*/}*.js',
                      '&lt;%= yeoman.app %&gt;/images/{,*/}*.{png,jpg,jpeg,gif,webp}',
                      '&lt;%= yeoman.app %&gt;/scripts/templates/*.{ejs,mustache,hbs}',
                      'test/spec/**/*.js'
                  ]
              },
              handlebars: {
                  files: [
                      '&lt;%= yeoman.app %&gt;/scripts/templates/*.hbs'
                  ],
                  tasks: ['handlebars']
              },
              test: {
                  files: ['&lt;%= yeoman.app %&gt;/scripts/{,*/}*.js', 'test/spec/**/*.js'],
                  tasks: ['test']
              }
          },
          connect: {
              options: {
                  port: SERVER_PORT,
                  // change this to '0.0.0.0' to access the server from outside
                  hostname: 'localhost'
              },
              livereload: {
                  options: {
                      middleware: function (connect) {
                          return [
                              lrSnippet,
                              mountFolder(connect, '.tmp'),
                              mountFolder(connect, yeomanConfig.app)
                          ];
                      }
                  }
              },
              test: {
                  options: {
                      port: 9001,
                      middleware: function (connect) {
                          return [
                              lrSnippet,
                              mountFolder(connect, '.tmp'),
                              mountFolder(connect, 'test'),
                              mountFolder(connect, yeomanConfig.app)
                          ];
                      }
                  }
              },
              dist: {
                  options: {
                      middleware: function (connect) {
                          return [
                              mountFolder(connect, yeomanConfig.dist)
                          ];
                      }
                  }
              }
          },
          open: {
              server: {
                  path: 'http://localhost:&lt;%= connect.options.port %&gt;'
              }
          },
          clean: {
              dist: ['.tmp', '&lt;%= yeoman.dist %&gt;/*'],
              server: '.tmp'
          },
          jshint: {
              options: {
                  jshintrc: '.jshintrc',
                  reporter: require('jshint-stylish')
              },
              all: [
                  'Gruntfile.js',
                  '&lt;%= yeoman.app %&gt;/scripts/{,*/}*.js',
                  '!&lt;%= yeoman.app %&gt;/scripts/vendor/*',
                  'test/spec/{,*/}*.js'
              ]
          },
          jasmine: {
              all:{
                  src : '/scripts/{,*/}*.js',
                  options: {
                      keepRunner: true,
                      specs : 'test/spec/**/*.js',
                      vendor : [
                          '&lt;%= yeoman.app %&gt;/bower_components/jquery/jquery.js',
                          '&lt;%= yeoman.app %&gt;/bower_components/underscore/underscore.js',
                          '&lt;%= yeoman.app %&gt;/bower_components/backbone/backbone.js',
                          '.tmp/scripts/templates.js'
                      ]
                  }
              }
          },
          coffee: {
              dist: {
                  files: [{
                      // rather than compiling multiple files here you should
                      // require them into your main .coffee file
                      expand: true,
                      cwd: '&lt;%= yeoman.app %&gt;/scripts',
                      src: '{,*/}*.coffee',
                      dest: '.tmp/scripts',
                      ext: '.js'
                  }]
              },
              test: {
                  files: [{
                      expand: true,
                      cwd: 'test/spec',
                      src: '{,*/}*.coffee',
                      dest: '.tmp/spec',
                      ext: '.js'
                  }]
              }
          },
          compass: {
              options: {
                  sassDir: '&lt;%= yeoman.app %&gt;/styles',
                  cssDir: '.tmp/styles',
                  imagesDir: '&lt;%= yeoman.app %&gt;/images',
                  javascriptsDir: '&lt;%= yeoman.app %&gt;/scripts',
                  fontsDir: '&lt;%= yeoman.app %&gt;/styles/fonts',
                  importPath: '&lt;%= yeoman.app %&gt;/bower_components',
                  relativeAssets: true
              },
              dist: {},
              server: {
                  options: {
                      debugInfo: true
                  }
              }
          },
          requirejs: {
              dist: {
                  // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js
                  options: {
                      baseUrl: '&lt;%= yeoman.app %&gt;/scripts',
                      optimize: 'none',
                      paths: {
                          'templates': '../../.tmp/scripts/templates',
                          'jquery': '../../app/bower_components/jquery/jquery',
                          'underscore': '../../app/bower_components/underscore/underscore',
                          'backbone': '../../app/bower_components/backbone/backbone'
                      },
                      // TODO: Figure out how to make sourcemaps work with grunt-usemin
                      // https://github.com/yeoman/grunt-usemin/issues/30
                      //generateSourceMaps: true,
                      // required to support SourceMaps
                      // http://requirejs.org/docs/errors.html#sourcemapcomments
                      preserveLicenseComments: false,
                      useStrict: true
                      //uglify2: {} // https://github.com/mishoo/UglifyJS2
                  }
              }
          },
          useminPrepare: {
              html: '&lt;%= yeoman.app %&gt;/index.html',
              options: {
                  dest: '&lt;%= yeoman.dist %&gt;'
              }
          },
          usemin: {
              html: ['&lt;%= yeoman.dist %&gt;/{,*/}*.html'],
              css: ['&lt;%= yeoman.dist %&gt;/styles/{,*/}*.css'],
              options: {
                  dirs: ['&lt;%= yeoman.dist %&gt;']
              }
          },
          imagemin: {
              dist: {
                  files: [{
                      expand: true,
                      cwd: '&lt;%= yeoman.app %&gt;/images',
                      src: '{,*/}*.{png,jpg,jpeg}',
                      dest: '&lt;%= yeoman.dist %&gt;/images'
                  }]
              }
          },
          cssmin: {
              dist: {
                  files: {
                      '&lt;%= yeoman.dist %&gt;/styles/main.css': [
                          '.tmp/styles/{,*/}*.css',
                          '&lt;%= yeoman.app %&gt;/styles/{,*/}*.css'
                      ]
                  }
              }
          },
          htmlmin: {
              dist: {
                  options: {
                      /*removeCommentsFromCDATA: true,
                      // https://github.com/yeoman/grunt-usemin/issues/44
                      //collapseWhitespace: true,
                      collapseBooleanAttributes: true,
                      removeAttributeQuotes: true,
                      removeRedundantAttributes: true,
                      useShortDoctype: true,
                      removeEmptyAttributes: true,
                      removeOptionalTags: true*/
                  },
                  files: [{
                      expand: true,
                      cwd: '&lt;%= yeoman.app %&gt;',
                      src: '*.html',
                      dest: '&lt;%= yeoman.dist %&gt;'
                  }]
              }
          },
          copy: {
              dist: {
                  files: [{
                      expand: true,
                      dot: true,
                      cwd: '&lt;%= yeoman.app %&gt;',
                      dest: '&lt;%= yeoman.dist %&gt;',
                      src: [
                          '*.{ico,txt}',
                          '.htaccess',
                          'images/{,*/}*.{webp,gif}',
                          'styles/fonts/{,*/}*.*',
                          'bower_components/sass-bootstrap/fonts/*.*'
                      ]
                  }]
              }
          },
          bower: {
              all: {
                  rjsConfig: '&lt;%= yeoman.app %&gt;/scripts/main.js'
              }
          },
          handlebars: {
              compile: {
                  options: {
                      namespace: 'JST',
                      amd: true
                  },
                  files: {
                      '.tmp/scripts/templates.js': ['&lt;%= yeoman.app %&gt;/scripts/templates/*.hbs']
                  }
              }
          },
          rev: {
              dist: {
                  files: {
                      src: [
                          '&lt;%= yeoman.dist %&gt;/scripts/{,*/}*.js',
                          '&lt;%= yeoman.dist %&gt;/styles/{,*/}*.css',
                          '&lt;%= yeoman.dist %&gt;/images/{,*/}*.{png,jpg,jpeg,gif,webp}',
                          '/styles/fonts/{,*/}*.*',
                          'bower_components/sass-bootstrap/fonts/*.*'
                      ]
                  }
              }
          }
      });
  
      grunt.registerTask('createDefaultTemplate', function () {
          grunt.file.write('.tmp/scripts/templates.js', 'this.JST = this.JST || {};');
      });
  
      grunt.registerTask('server', function (target) {
          if (target === 'dist') {
              return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
          }
  
          if (target === 'test') {
              return grunt.task.run([
                  'clean:server',
                  'coffee',
                  'createDefaultTemplate',
                  'handlebars',
                  'compass:server',
                  'connect:test',
                  'watch:livereload'
              ]);
          }
  
          grunt.task.run([
              'clean:server',
              'coffee:dist',
              'createDefaultTemplate',
              'handlebars',
              'compass:server',
              'connect:livereload',
              'open',
              'watch'
          ]);
      });
  
      grunt.registerTask('test', [
          'clean:server',
          'coffee',
          'createDefaultTemplate',
          'handlebars',
          'compass',
          'jasmine',
          'watch:test'
      ]);
  
      grunt.registerTask('build', [
          'clean:dist',
          'coffee',
          'createDefaultTemplate',
          'handlebars',
          'compass:dist',
          'useminPrepare',
          'requirejs',
          'imagemin',
          'htmlmin',
          'concat',
          'cssmin',
          'uglify',
          'copy',
          'rev',
          'usemin'
      ]);
  
      grunt.registerTask('default', [
          'jshint',
          'test',
          'build'
      ]);
  };
  </code></pre>