Why does rake db:migrate sometimes add trailing whitespace to structure.sql?

Here's a solution that you can commit to version control: trim the trailing whitespace as a db:migrate hook.

In lib/tasks/db.rake:

namespace :db do
  def remove_whitespace_in_structure
    if Rails.env.development?
      `sed -i '' -e's/[[:space:]]*$//' db/structure.sql`
    end
  end

  task :migrate do
    remove_whitespace_in_structure
  end
end

The above code may look like it's overwriting db:migrate, but it's a hook that will run right after the normal db:migrate task.


I just set up a git filter for this. Unfortunately, this is not something you can add to the repo; each team member will have to set it up.

In .gitconfig (or .git/config)

[filter "remove-trailing-whitespace"]
  clean = sed -E 's/[[:space:]]*$//'
  smudge = cat

In .gitattributes or .git/info/attributes

db/structure.sql filter=remove-trailing-whitespace

See the documentation on gitattributes for more information on git filters.