diff --git a/WHATSNEW b/WHATSNEW
index 8f1b8f184..754e1f502 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -42,6 +42,10 @@ Changes that could break older environments:
of Ant 1.8.1.
Bugzilla Report 49373.
+ * The files and directories used by Git, Mercurial and Bazaar to
+ store their information are now excluded by the defaultexcludes.
+ Bugzilla Report 49624.
+
Fixed bugs:
-----------
diff --git a/docs/manual/dirtasks.html b/docs/manual/dirtasks.html
index 28a4daf03..9d4e145e2 100644
--- a/docs/manual/dirtasks.html
+++ b/docs/manual/dirtasks.html
@@ -265,7 +265,7 @@ as an implicit fileset.
There are a set of definitions that are excluded by default from all
-directory-based tasks. They are:
+directory-based tasks. As of Ant 1.8.1 they are:
**/*~
**/#*#
@@ -282,6 +282,23 @@ directory-based tasks. They are:
**/.svn/**
**/.DS_Store
+Ant 1.8.2 adds the folllowing default excludes:
+
+ **/.git
+ **/.git/**
+ **/.gitattributes
+ **/.gitignore
+ **/.gitmodules
+ **/.hg
+ **/.hg/**
+ **/.hgignore
+ **/.hgsub
+ **/.hgsubstate
+ **/.hgtags
+ **/.bzr
+ **/.bzr/**
+ **/.bzrignore
+
If you do not want these default excludes applied, you may disable
them with the defaultexcludes="no"
attribute.
diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java
index 7531954d4..94973bbb6 100644
--- a/src/main/org/apache/tools/ant/DirectoryScanner.java
+++ b/src/main/org/apache/tools/ant/DirectoryScanner.java
@@ -170,6 +170,26 @@ public class DirectoryScanner
SelectorUtils.DEEP_TREE_MATCH + "/.svn",
SelectorUtils.DEEP_TREE_MATCH + "/.svn/" + SelectorUtils.DEEP_TREE_MATCH,
+ // Git
+ SelectorUtils.DEEP_TREE_MATCH + "/.git",
+ SelectorUtils.DEEP_TREE_MATCH + "/.git/" + SelectorUtils.DEEP_TREE_MATCH,
+ SelectorUtils.DEEP_TREE_MATCH + "/.gitattributes",
+ SelectorUtils.DEEP_TREE_MATCH + "/.gitignore",
+ SelectorUtils.DEEP_TREE_MATCH + "/.gitmodules",
+
+ // Mercurial
+ SelectorUtils.DEEP_TREE_MATCH + "/.hg",
+ SelectorUtils.DEEP_TREE_MATCH + "/.hg/" + SelectorUtils.DEEP_TREE_MATCH,
+ SelectorUtils.DEEP_TREE_MATCH + "/.hgignore",
+ SelectorUtils.DEEP_TREE_MATCH + "/.hgsub",
+ SelectorUtils.DEEP_TREE_MATCH + "/.hgsubstate",
+ SelectorUtils.DEEP_TREE_MATCH + "/.hgtags",
+
+ // Bazaar
+ SelectorUtils.DEEP_TREE_MATCH + "/.bzr",
+ SelectorUtils.DEEP_TREE_MATCH + "/.bzr/" + SelectorUtils.DEEP_TREE_MATCH,
+ SelectorUtils.DEEP_TREE_MATCH + "/.bzrignore",
+
// Mac
SelectorUtils.DEEP_TREE_MATCH + "/.DS_Store"
};
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java
index 040eaa805..86efc6855 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java
@@ -53,6 +53,20 @@ public class DefaultExcludesTest extends BuildFileTest {
"**/vssver.scc",
"**/.svn",
"**/.svn/**",
+ "**/.git",
+ "**/.git/**",
+ "**/.gitattributes",
+ "**/.gitignore",
+ "**/.gitmodules",
+ "**/.hg",
+ "**/.hg/**",
+ "**/.hgignore",
+ "**/.hgsub",
+ "**/.hgsubstate",
+ "**/.hgtags",
+ "**/.bzr",
+ "**/.bzr/**",
+ "**/.bzrignore",
"**/.DS_Store"};
project.executeTarget("test1");
assertEquals("current default excludes", expected, DirectoryScanner.getDefaultExcludes());
@@ -74,6 +88,20 @@ public class DefaultExcludesTest extends BuildFileTest {
"**/vssver.scc",
"**/.svn",
"**/.svn/**",
+ "**/.git",
+ "**/.git/**",
+ "**/.gitattributes",
+ "**/.gitignore",
+ "**/.gitmodules",
+ "**/.hg",
+ "**/.hg/**",
+ "**/.hgignore",
+ "**/.hgsub",
+ "**/.hgsubstate",
+ "**/.hgtags",
+ "**/.bzr",
+ "**/.bzr/**",
+ "**/.bzrignore",
"**/.DS_Store",
"foo"};
project.executeTarget("test2");
@@ -96,6 +124,20 @@ public class DefaultExcludesTest extends BuildFileTest {
"**/vssver.scc",
"**/.svn",
"**/.svn/**",
+ "**/.git",
+ "**/.git/**",
+ "**/.gitattributes",
+ "**/.gitignore",
+ "**/.gitmodules",
+ "**/.hg",
+ "**/.hg/**",
+ "**/.hgignore",
+ "**/.hgsub",
+ "**/.hgsubstate",
+ "**/.hgtags",
+ "**/.bzr",
+ "**/.bzr/**",
+ "**/.bzrignore",
"**/.DS_Store"};
project.executeTarget("test3");
assertEquals("current default excludes", expected, DirectoryScanner.getDefaultExcludes());