diff --git a/.gitattributes b/.gitattributes
index 39d58ea0faacbcd847a87f260c91df0724c6daa4..95a1320ecf970d6da5f0841918a0df59574de392 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,7 +3,7 @@
 .hooks*          export-ignore
 
 # Custom attribute to mark sources as using our C code style.
-[attr]our-c-style  whitespace=tab-in-indent
+[attr]our-c-style  whitespace=tab-in-indent  format.clang-format
 
 /GitSetup        export-ignore
 /*.sh            export-ignore eol=lf
diff --git a/clang-format.bash b/clang-format.bash
index 3e82770f9eb821b68ab3660219e9d81453a1a8d3..8fa347c84c29532dfb94de953079edc09697d452 100755
--- a/clang-format.bash
+++ b/clang-format.bash
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 #=============================================================================
-# Copyright 2015-2016 Kitware, Inc.
+# Copyright 2015-2017 Kitware, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -106,17 +106,18 @@ case "$mode" in
     *) die "invalid mode: $mode" ;;
 esac
 
-# Filter sources to which our style should apply.
-list_cfg_files() {
-  $git_ls -z -- '*.c.in' '*.h.in' '*.hxx.in'
-}
-list_all_files() {
-  $git_ls -z -- '*.c' '*.c.in' '*.cxx' '*.h' '*.h.in' '*.hxx' '*.hxx.in'
+# List files as selected above.
+list_files() {
+  $git_ls |
+
+  # Select sources with our attribute.
+  git check-attr --stdin format.clang-format |
+  sed -n '/: format\.clang-format: set$/ {s/:[^:]*:[^:]*$//p}'
 }
 
 # Transform configured sources to protect @SYMBOLS@.
-list_cfg_files | xargs -0 -r sed -i 's/@\(KWSYS_[A-Z0-9_]\+\)@/x\1x/g'
+list_files | xargs -d '\n' sed -i 's/@\(KWSYS_[A-Z0-9_]\+\)@/x\1x/g'
 # Update sources in-place.
-list_all_files | xargs -0 "$clang_format" -i
+list_files | xargs -d '\n' "$clang_format" -i
 # Transform configured sources to restore @SYMBOLS@.
-list_cfg_files | xargs -0 -r sed -i 's/x\(KWSYS_[A-Z0-9_]\+\)x/@\1@/g'
+list_files | xargs -d '\n' sed -i 's/x\(KWSYS_[A-Z0-9_]\+\)x/@\1@/g'