optionally pull data only from a subdir in a repo
diff --git a/reclass/storage/yaml_git/__init__.py b/reclass/storage/yaml_git/__init__.py
index 8f54515..3c32bfa 100644
--- a/reclass/storage/yaml_git/__init__.py
+++ b/reclass/storage/yaml_git/__init__.py
@@ -34,15 +34,22 @@
 class GitURI(object):
 
     def __init__(self, dictionary):
-        self.repo = dictionary.get('repo', None)
-        self.branch = dictionary.get('branch', None)
+        self.repo = None
+        self.branch = None
+        self.root = None
+        self.update(dictionary)
 
     def update(self, dictionary):
         if 'repo' in dictionary: self.repo = dictionary['repo']
         if 'branch' in dictionary: self.branch = dictionary['branch']
+        if 'root' in dictionary:
+            if dictionary['root'] is None:
+                self.root = None
+            else:
+                self.root = dictionary['root'].replace('/', '.')
 
     def __repr__(self):
-        return '<{0}: {1} {2}>'.format(self.__class__.__name__, self.repo, self.branch)
+        return '<{0}: {1} {2} {3}>'.format(self.__class__.__name__, self.repo, self.branch, self.root)
 
 
 class GitRepo(object):
@@ -95,13 +102,15 @@
             ret[bname] = branch
         return ret
 
-    def nodes(self, branch):
+    def nodes(self, branch, subdir):
         ret = {}
         for name, file in self.files[branch].iteritems():
-            if name in ret:
-                raise reclass.errors.DuplicateNodeNameError(self.name, name, files[name], path)
-            else:
-                ret[name] = file
+            if subdir is None or name.startswith(subdir):
+                node_name = os.path.splitext(file.name)[0]
+                if node_name in ret:
+                    raise reclass.errors.DuplicateNodeNameError(self.name, name, files[name], path)
+                else:
+                    ret[node_name] = file
         return ret
 
 class ExternalNodeStorage(NodeStorageBase):
@@ -112,13 +121,13 @@
         super(ExternalNodeStorage, self).__init__(STORAGE_NAME)
 
         if nodes_uri is not None:
-            self._nodes_uri = GitURI({ 'branch': 'master', 'repo': None })
+            self._nodes_uri = GitURI({ 'branch': 'master' })
             self._nodes_uri.update(nodes_uri)
             self._load_repo(self._nodes_uri.repo)
-            self._nodes = self._repos[self._nodes_uri.repo].nodes(self._nodes_uri.branch)
+            self._nodes = self._repos[self._nodes_uri.repo].nodes(self._nodes_uri.branch, self._nodes_uri.root)
 
         if classes_uri is not None:
-            self._classes_default_uri = GitURI({ 'branch': '__env__', 'repo': None })
+            self._classes_default_uri = GitURI({ 'branch': '__env__' })
             self._classes_default_uri.update(classes_uri)
             self._load_repo(self._classes_default_uri.repo)
 
@@ -126,7 +135,7 @@
             if 'env_overrides' in classes_uri:
                 for override in classes_uri['env_overrides']:
                     for env, options in override.iteritems():
-                        uri = GitURI({ 'branch': env, 'repo': self._classes_default_uri.repo })
+                        uri = GitURI({ 'branch': env, 'repo': self._classes_default_uri.repo, 'root': self._classes_default_uri.root })
                         uri.update(options)
                         self._classes_uri.append((env, uri))
                         self._load_repo(uri.repo)
@@ -144,6 +153,8 @@
 
     def get_class(self, name, environment):
         uri = self._env_to_uri(environment)
+        if uri.root is not None:
+            name = '{0}.{1}'.format(uri.root, name)
         file = self._repos[uri.repo].files[uri.branch][name]
         blob = self._repos[uri.repo].get(file.id)
         entity = YamlData.from_string(blob.data, 'git_fs://{0}#{1}/{2}'.format(uri.repo, uri.branch, file.path)).get_entity(name)