Add a new hook to forbid new submodules
diff --git a/get-git-lfs.py b/get-git-lfs.py
index f71b5e2..4897a56 100755
--- a/get-git-lfs.py
+++ b/get-git-lfs.py
@@ -34,5 +34,6 @@
                 shutil.copyfileobj(src_file, dest_file)
     os.chmod(DEST_PATH, 0o755)
 
+
 if __name__ == '__main__':
     exit(main())
diff --git a/pre_commit_hooks/check_added_large_files.py b/pre_commit_hooks/check_added_large_files.py
index 03e88b8..b65c32a 100644
--- a/pre_commit_hooks/check_added_large_files.py
+++ b/pre_commit_hooks/check_added_large_files.py
@@ -6,7 +6,6 @@
 import argparse
 import math
 import os
-import sys
 
 from pre_commit_hooks.util import added_files
 from pre_commit_hooks.util import CalledProcessError
@@ -49,8 +48,6 @@
 
 
 def main(argv=None):
-    argv = argv if argv is not None else sys.argv[1:]
-
     parser = argparse.ArgumentParser()
     parser.add_argument(
         'filenames', nargs='*',
diff --git a/pre_commit_hooks/check_merge_conflict.py b/pre_commit_hooks/check_merge_conflict.py
index 4a98843..d986998 100644
--- a/pre_commit_hooks/check_merge_conflict.py
+++ b/pre_commit_hooks/check_merge_conflict.py
@@ -2,7 +2,6 @@
 
 import argparse
 import os.path
-import sys
 
 CONFLICT_PATTERNS = [
     b'<<<<<<< ',
@@ -41,5 +40,6 @@
 
     return retcode
 
+
 if __name__ == '__main__':
-    sys.exit(detect_merge_conflict())
+    exit(detect_merge_conflict())
diff --git a/pre_commit_hooks/detect_aws_credentials.py b/pre_commit_hooks/detect_aws_credentials.py
index 4c51546..9dda217 100644
--- a/pre_commit_hooks/detect_aws_credentials.py
+++ b/pre_commit_hooks/detect_aws_credentials.py
@@ -67,5 +67,6 @@
     else:
         return 0
 
+
 if __name__ == '__main__':
     exit(main())
diff --git a/pre_commit_hooks/fix_encoding_pragma.py b/pre_commit_hooks/fix_encoding_pragma.py
index 5dcff93..3bf234e 100644
--- a/pre_commit_hooks/fix_encoding_pragma.py
+++ b/pre_commit_hooks/fix_encoding_pragma.py
@@ -138,5 +138,6 @@
 
     return retv
 
+
 if __name__ == "__main__":
     exit(main())
diff --git a/pre_commit_hooks/forbid_new_submodules.py b/pre_commit_hooks/forbid_new_submodules.py
new file mode 100644
index 0000000..19f85d0
--- /dev/null
+++ b/pre_commit_hooks/forbid_new_submodules.py
@@ -0,0 +1,31 @@
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+from pre_commit_hooks.util import cmd_output
+
+
+def main(argv=None):
+    # `argv` is ignored, pre-commit will send us a list of files that we
+    # don't care about
+    added_diff = cmd_output(
+        'git', 'diff', '--staged', '--diff-filter=A', '--raw',
+    )
+    retv = 0
+    for line in added_diff.splitlines():
+        metadata, filename = line.split('\t', 1)
+        new_mode = metadata.split(' ')[1]
+        if new_mode == '160000':
+            print('{}: new submodule introduced'.format(filename))
+            retv = 1
+
+    if retv:
+        print('This commit introduces new submodules.')
+        print('Did you unintentionally `git add .`?')
+        print('To fix: git rm {thesubmodule}  # no trailing slash')
+        print('Also check .gitmodules')
+
+    return retv
+
+
+if __name__ == '__main__':
+    exit(main())
diff --git a/tests/forbid_new_submodules_test.py b/tests/forbid_new_submodules_test.py
new file mode 100644
index 0000000..1750e00
--- /dev/null
+++ b/tests/forbid_new_submodules_test.py
@@ -0,0 +1,39 @@
+from __future__ import absolute_import
+
+import pytest
+from pre_commit.util import cmd_output
+
+from pre_commit_hooks.forbid_new_submodules import main
+
+
+@pytest.yield_fixture
+def git_dir_with_git_dir(tmpdir):
+    with tmpdir.as_cwd():
+        cmd_output('git', 'init', '.')
+        cmd_output('git', 'commit', '-m', 'init', '--allow-empty')
+        cmd_output('git', 'init', 'foo')
+        with tmpdir.join('foo').as_cwd():
+            cmd_output('git', 'commit', '-m', 'init', '--allow-empty')
+        yield
+
+
+@pytest.mark.parametrize(
+    'cmd',
+    (
+        # Actually add the submodule
+        ('git', 'submodule', 'add', './foo'),
+        # Sneaky submodule add (that doesn't show up in .gitmodules)
+        ('git', 'add', 'foo'),
+    ),
+)
+def test_main_new_submodule(git_dir_with_git_dir, capsys, cmd):
+    cmd_output(*cmd)
+    assert main() == 1
+    out, _ = capsys.readouterr()
+    assert out.startswith('foo: new submodule introduced\n')
+
+
+def test_main_no_new_submodule(git_dir_with_git_dir):
+    open('test.py', 'a+').close()
+    cmd_output('git', 'add', 'test.py')
+    assert main() == 0