diff --git a/hgitaly/stub/__init__.py b/hgitaly/stub/__init__.py
new file mode 100644
diff --git a/hgitaly/stub/commit_pb2.py b/hgitaly/stub/commit_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..7196784b950a3b3258e1dcb84af7c2986868cb53_aGdpdGFseS9zdHViL2NvbW1pdF9wYjIucHk=
--- /dev/null
+++ b/hgitaly/stub/commit_pb2.py
@@ -0,0 +1,2133 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: commit.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from . import shared_pb2 as shared__pb2
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='commit.proto',
+  package='gitaly',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x0c\x63ommit.proto\x12\x06gitaly\x1a\x0cshared.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"N\n\x12\x43ommitStatsRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"H\n\x13\x43ommitStatsResponse\x12\x0b\n\x03oid\x18\x01 \x01(\t\x12\x11\n\tadditions\x18\x02 \x01(\x05\x12\x11\n\tdeletions\x18\x03 \x01(\x05\"h\n\x17\x43ommitIsAncestorRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x13\n\x0b\x61ncestor_id\x18\x02 \x01(\t\x12\x10\n\x08\x63hild_id\x18\x03 \x01(\t\")\n\x18\x43ommitIsAncestorResponse\x12\r\n\x05value\x18\x01 \x01(\x08\"i\n\x10TreeEntryRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05limit\x18\x04 \x01(\x03\"\xb5\x01\n\x11TreeEntryResponse\x12\x32\n\x04type\x18\x01 \x01(\x0e\x32$.gitaly.TreeEntryResponse.ObjectType\x12\x0b\n\x03oid\x18\x02 \x01(\t\x12\x0c\n\x04size\x18\x03 \x01(\x03\x12\x0c\n\x04mode\x18\x04 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x05 \x01(\x0c\"5\n\nObjectType\x12\n\n\x06\x43OMMIT\x10\x00\x12\x08\n\x04\x42LOB\x10\x01\x12\x08\n\x04TREE\x10\x02\x12\x07\n\x03TAG\x10\x03\"Y\n\x15\x43ommitsBetweenRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x0c\n\x04\x66rom\x18\x02 \x01(\x0c\x12\n\n\x02to\x18\x03 \x01(\x0c\"<\n\x16\x43ommitsBetweenResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"\xc7\x01\n\x13\x43ountCommitsRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12)\n\x05\x61\x66ter\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x06\x62\x65\x66ore\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04path\x18\x05 \x01(\x0c\x12\x11\n\tmax_count\x18\x06 \x01(\x05\"%\n\x14\x43ountCommitsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\"\xc5\x01\n\tTreeEntry\x12\x0b\n\x03oid\x18\x01 \x01(\t\x12\x10\n\x08root_oid\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12)\n\x04type\x18\x04 \x01(\x0e\x32\x1b.gitaly.TreeEntry.EntryType\x12\x0c\n\x04mode\x18\x05 \x01(\x05\x12\x12\n\ncommit_oid\x18\x06 \x01(\t\x12\x11\n\tflat_path\x18\x07 \x01(\x0c\"+\n\tEntryType\x12\x08\n\x04\x42LOB\x10\x00\x12\x08\n\x04TREE\x10\x01\x12\n\n\x06\x43OMMIT\x10\x03\"_\n\x15GetTreeEntriesRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\"<\n\x16GetTreeEntriesResponse\x12\"\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x11.gitaly.TreeEntry\"L\n\x10ListFilesRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\"\n\x11ListFilesResponse\x12\r\n\x05paths\x18\x01 \x03(\x0c\"M\n\x11\x46indCommitRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"7\n\x12\x46indCommitResponse\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\"N\n\x17ListCommitsByOidRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x0b\n\x03oid\x18\x02 \x03(\t\">\n\x18ListCommitsByOidResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"\xcd\x01\n\x15\x46indAllCommitsRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x11\n\tmax_count\x18\x03 \x01(\x05\x12\x0c\n\x04skip\x18\x04 \x01(\x05\x12\x32\n\x05order\x18\x05 \x01(\x0e\x32#.gitaly.FindAllCommitsRequest.Order\"%\n\x05Order\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04TOPO\x10\x01\x12\x08\n\x04\x44\x41TE\x10\x02\"<\n\x16\x46indAllCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"\x8e\x02\n\x12\x46indCommitsRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05paths\x18\x05 \x03(\x0c\x12\x0e\n\x06\x66ollow\x18\x06 \x01(\x08\x12\x13\n\x0bskip_merges\x18\x07 \x01(\x08\x12\x14\n\x0c\x64isable_walk\x18\x08 \x01(\x08\x12)\n\x05\x61\x66ter\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x06\x62\x65\x66ore\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"9\n\x13\x46indCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"R\n\x16\x43ommitLanguagesRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\x8e\x01\n\x17\x43ommitLanguagesResponse\x12;\n\tlanguages\x18\x01 \x03(\x0b\x32(.gitaly.CommitLanguagesResponse.Language\x1a\x36\n\x08Language\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05share\x18\x02 \x01(\x02\x12\r\n\x05\x63olor\x18\x03 \x01(\t\"Y\n\x0fRawBlameRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\" \n\x10RawBlameResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"b\n\x18LastCommitForPathRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\">\n\x19LastCommitForPathResponse\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\"\x8f\x01\n\x17\x43ommitsByMessageRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\r\n\x05limit\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\x0c\x12\r\n\x05query\x18\x06 \x01(\t\">\n\x18\x43ommitsByMessageResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"W\n\x1f\x46ilterShasWithSignaturesRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x0c\n\x04shas\x18\x02 \x03(\x0c\"0\n FilterShasWithSignaturesResponse\x12\x0c\n\x04shas\x18\x01 \x03(\x0c\"Z\n\x1d\x45xtractCommitSignatureRequest\x12&\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.Repository\x12\x11\n\tcommit_id\x18\x02 \x01(\t\"H\n\x1e\x45xtractCommitSignatureResponse\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\x13\n\x0bsigned_text\x18\x02 \x01(\x0c\x32\xaa\x0b\n\rCommitService\x12W\n\x10\x43ommitIsAncestor\x12\x1f.gitaly.CommitIsAncestorRequest\x1a .gitaly.CommitIsAncestorResponse\"\x00\x12\x44\n\tTreeEntry\x12\x18.gitaly.TreeEntryRequest\x1a\x19.gitaly.TreeEntryResponse\"\x00\x30\x01\x12S\n\x0e\x43ommitsBetween\x12\x1d.gitaly.CommitsBetweenRequest\x1a\x1e.gitaly.CommitsBetweenResponse\"\x00\x30\x01\x12K\n\x0c\x43ountCommits\x12\x1b.gitaly.CountCommitsRequest\x1a\x1c.gitaly.CountCommitsResponse\"\x00\x12S\n\x0eGetTreeEntries\x12\x1d.gitaly.GetTreeEntriesRequest\x1a\x1e.gitaly.GetTreeEntriesResponse\"\x00\x30\x01\x12\x44\n\tListFiles\x12\x18.gitaly.ListFilesRequest\x1a\x19.gitaly.ListFilesResponse\"\x00\x30\x01\x12\x45\n\nFindCommit\x12\x19.gitaly.FindCommitRequest\x1a\x1a.gitaly.FindCommitResponse\"\x00\x12H\n\x0b\x43ommitStats\x12\x1a.gitaly.CommitStatsRequest\x1a\x1b.gitaly.CommitStatsResponse\"\x00\x12S\n\x0e\x46indAllCommits\x12\x1d.gitaly.FindAllCommitsRequest\x1a\x1e.gitaly.FindAllCommitsResponse\"\x00\x30\x01\x12J\n\x0b\x46indCommits\x12\x1a.gitaly.FindCommitsRequest\x1a\x1b.gitaly.FindCommitsResponse\"\x00\x30\x01\x12T\n\x0f\x43ommitLanguages\x12\x1e.gitaly.CommitLanguagesRequest\x1a\x1f.gitaly.CommitLanguagesResponse\"\x00\x12\x41\n\x08RawBlame\x12\x17.gitaly.RawBlameRequest\x1a\x18.gitaly.RawBlameResponse\"\x00\x30\x01\x12Z\n\x11LastCommitForPath\x12 .gitaly.LastCommitForPathRequest\x1a!.gitaly.LastCommitForPathResponse\"\x00\x12Y\n\x10\x43ommitsByMessage\x12\x1f.gitaly.CommitsByMessageRequest\x1a .gitaly.CommitsByMessageResponse\"\x00\x30\x01\x12Y\n\x10ListCommitsByOid\x12\x1f.gitaly.ListCommitsByOidRequest\x1a .gitaly.ListCommitsByOidResponse\"\x00\x30\x01\x12s\n\x18\x46ilterShasWithSignatures\x12\'.gitaly.FilterShasWithSignaturesRequest\x1a(.gitaly.FilterShasWithSignaturesResponse\"\x00(\x01\x30\x01\x12k\n\x16\x45xtractCommitSignature\x12%.gitaly.ExtractCommitSignatureRequest\x1a&.gitaly.ExtractCommitSignatureResponse\"\x00\x30\x01\x62\x06proto3')
+  ,
+  dependencies=[shared__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
+
+
+
+_TREEENTRYRESPONSE_OBJECTTYPE = _descriptor.EnumDescriptor(
+  name='ObjectType',
+  full_name='gitaly.TreeEntryResponse.ObjectType',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='COMMIT', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BLOB', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TREE', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TAG', index=3, number=3,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=610,
+  serialized_end=663,
+)
+_sym_db.RegisterEnumDescriptor(_TREEENTRYRESPONSE_OBJECTTYPE)
+
+_TREEENTRY_ENTRYTYPE = _descriptor.EnumDescriptor(
+  name='EntryType',
+  full_name='gitaly.TreeEntry.EntryType',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='BLOB', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TREE', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='COMMIT', index=2, number=3,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1214,
+  serialized_end=1257,
+)
+_sym_db.RegisterEnumDescriptor(_TREEENTRY_ENTRYTYPE)
+
+_FINDALLCOMMITSREQUEST_ORDER = _descriptor.EnumDescriptor(
+  name='Order',
+  full_name='gitaly.FindAllCommitsRequest.Order',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NONE', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TOPO', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DATE', index=2, number=2,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1981,
+  serialized_end=2018,
+)
+_sym_db.RegisterEnumDescriptor(_FINDALLCOMMITSREQUEST_ORDER)
+
+
+_COMMITSTATSREQUEST = _descriptor.Descriptor(
+  name='CommitStatsRequest',
+  full_name='gitaly.CommitStatsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.CommitStatsRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.CommitStatsRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=71,
+  serialized_end=149,
+)
+
+
+_COMMITSTATSRESPONSE = _descriptor.Descriptor(
+  name='CommitStatsResponse',
+  full_name='gitaly.CommitStatsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='oid', full_name='gitaly.CommitStatsResponse.oid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='additions', full_name='gitaly.CommitStatsResponse.additions', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='deletions', full_name='gitaly.CommitStatsResponse.deletions', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=151,
+  serialized_end=223,
+)
+
+
+_COMMITISANCESTORREQUEST = _descriptor.Descriptor(
+  name='CommitIsAncestorRequest',
+  full_name='gitaly.CommitIsAncestorRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.CommitIsAncestorRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='ancestor_id', full_name='gitaly.CommitIsAncestorRequest.ancestor_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='child_id', full_name='gitaly.CommitIsAncestorRequest.child_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=225,
+  serialized_end=329,
+)
+
+
+_COMMITISANCESTORRESPONSE = _descriptor.Descriptor(
+  name='CommitIsAncestorResponse',
+  full_name='gitaly.CommitIsAncestorResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='value', full_name='gitaly.CommitIsAncestorResponse.value', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=331,
+  serialized_end=372,
+)
+
+
+_TREEENTRYREQUEST = _descriptor.Descriptor(
+  name='TreeEntryRequest',
+  full_name='gitaly.TreeEntryRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.TreeEntryRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.TreeEntryRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.TreeEntryRequest.path', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='gitaly.TreeEntryRequest.limit', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=374,
+  serialized_end=479,
+)
+
+
+_TREEENTRYRESPONSE = _descriptor.Descriptor(
+  name='TreeEntryResponse',
+  full_name='gitaly.TreeEntryResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='type', full_name='gitaly.TreeEntryResponse.type', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='oid', full_name='gitaly.TreeEntryResponse.oid', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='size', full_name='gitaly.TreeEntryResponse.size', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='gitaly.TreeEntryResponse.mode', index=3,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='gitaly.TreeEntryResponse.data', index=4,
+      number=5, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _TREEENTRYRESPONSE_OBJECTTYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=482,
+  serialized_end=663,
+)
+
+
+_COMMITSBETWEENREQUEST = _descriptor.Descriptor(
+  name='CommitsBetweenRequest',
+  full_name='gitaly.CommitsBetweenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.CommitsBetweenRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='from', full_name='gitaly.CommitsBetweenRequest.from', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='to', full_name='gitaly.CommitsBetweenRequest.to', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=665,
+  serialized_end=754,
+)
+
+
+_COMMITSBETWEENRESPONSE = _descriptor.Descriptor(
+  name='CommitsBetweenResponse',
+  full_name='gitaly.CommitsBetweenResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commits', full_name='gitaly.CommitsBetweenResponse.commits', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=756,
+  serialized_end=816,
+)
+
+
+_COUNTCOMMITSREQUEST = _descriptor.Descriptor(
+  name='CountCommitsRequest',
+  full_name='gitaly.CountCommitsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.CountCommitsRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.CountCommitsRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='after', full_name='gitaly.CountCommitsRequest.after', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='before', full_name='gitaly.CountCommitsRequest.before', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.CountCommitsRequest.path', index=4,
+      number=5, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='max_count', full_name='gitaly.CountCommitsRequest.max_count', index=5,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=819,
+  serialized_end=1018,
+)
+
+
+_COUNTCOMMITSRESPONSE = _descriptor.Descriptor(
+  name='CountCommitsResponse',
+  full_name='gitaly.CountCommitsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='count', full_name='gitaly.CountCommitsResponse.count', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1020,
+  serialized_end=1057,
+)
+
+
+_TREEENTRY = _descriptor.Descriptor(
+  name='TreeEntry',
+  full_name='gitaly.TreeEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='oid', full_name='gitaly.TreeEntry.oid', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='root_oid', full_name='gitaly.TreeEntry.root_oid', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.TreeEntry.path', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='gitaly.TreeEntry.type', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='gitaly.TreeEntry.mode', index=4,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='commit_oid', full_name='gitaly.TreeEntry.commit_oid', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='flat_path', full_name='gitaly.TreeEntry.flat_path', index=6,
+      number=7, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _TREEENTRY_ENTRYTYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1060,
+  serialized_end=1257,
+)
+
+
+_GETTREEENTRIESREQUEST = _descriptor.Descriptor(
+  name='GetTreeEntriesRequest',
+  full_name='gitaly.GetTreeEntriesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.GetTreeEntriesRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.GetTreeEntriesRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.GetTreeEntriesRequest.path', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1259,
+  serialized_end=1354,
+)
+
+
+_GETTREEENTRIESRESPONSE = _descriptor.Descriptor(
+  name='GetTreeEntriesResponse',
+  full_name='gitaly.GetTreeEntriesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entries', full_name='gitaly.GetTreeEntriesResponse.entries', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1356,
+  serialized_end=1416,
+)
+
+
+_LISTFILESREQUEST = _descriptor.Descriptor(
+  name='ListFilesRequest',
+  full_name='gitaly.ListFilesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.ListFilesRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.ListFilesRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1418,
+  serialized_end=1494,
+)
+
+
+_LISTFILESRESPONSE = _descriptor.Descriptor(
+  name='ListFilesResponse',
+  full_name='gitaly.ListFilesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='paths', full_name='gitaly.ListFilesResponse.paths', index=0,
+      number=1, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1496,
+  serialized_end=1530,
+)
+
+
+_FINDCOMMITREQUEST = _descriptor.Descriptor(
+  name='FindCommitRequest',
+  full_name='gitaly.FindCommitRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.FindCommitRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.FindCommitRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1532,
+  serialized_end=1609,
+)
+
+
+_FINDCOMMITRESPONSE = _descriptor.Descriptor(
+  name='FindCommitResponse',
+  full_name='gitaly.FindCommitResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commit', full_name='gitaly.FindCommitResponse.commit', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1611,
+  serialized_end=1666,
+)
+
+
+_LISTCOMMITSBYOIDREQUEST = _descriptor.Descriptor(
+  name='ListCommitsByOidRequest',
+  full_name='gitaly.ListCommitsByOidRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.ListCommitsByOidRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='oid', full_name='gitaly.ListCommitsByOidRequest.oid', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1668,
+  serialized_end=1746,
+)
+
+
+_LISTCOMMITSBYOIDRESPONSE = _descriptor.Descriptor(
+  name='ListCommitsByOidResponse',
+  full_name='gitaly.ListCommitsByOidResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commits', full_name='gitaly.ListCommitsByOidResponse.commits', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1748,
+  serialized_end=1810,
+)
+
+
+_FINDALLCOMMITSREQUEST = _descriptor.Descriptor(
+  name='FindAllCommitsRequest',
+  full_name='gitaly.FindAllCommitsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.FindAllCommitsRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.FindAllCommitsRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='max_count', full_name='gitaly.FindAllCommitsRequest.max_count', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='skip', full_name='gitaly.FindAllCommitsRequest.skip', index=3,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='order', full_name='gitaly.FindAllCommitsRequest.order', index=4,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _FINDALLCOMMITSREQUEST_ORDER,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1813,
+  serialized_end=2018,
+)
+
+
+_FINDALLCOMMITSRESPONSE = _descriptor.Descriptor(
+  name='FindAllCommitsResponse',
+  full_name='gitaly.FindAllCommitsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commits', full_name='gitaly.FindAllCommitsResponse.commits', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2020,
+  serialized_end=2080,
+)
+
+
+_FINDCOMMITSREQUEST = _descriptor.Descriptor(
+  name='FindCommitsRequest',
+  full_name='gitaly.FindCommitsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.FindCommitsRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.FindCommitsRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='gitaly.FindCommitsRequest.limit', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='gitaly.FindCommitsRequest.offset', index=3,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='paths', full_name='gitaly.FindCommitsRequest.paths', index=4,
+      number=5, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='follow', full_name='gitaly.FindCommitsRequest.follow', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='skip_merges', full_name='gitaly.FindCommitsRequest.skip_merges', index=6,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='disable_walk', full_name='gitaly.FindCommitsRequest.disable_walk', index=7,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='after', full_name='gitaly.FindCommitsRequest.after', index=8,
+      number=9, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='before', full_name='gitaly.FindCommitsRequest.before', index=9,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2083,
+  serialized_end=2353,
+)
+
+
+_FINDCOMMITSRESPONSE = _descriptor.Descriptor(
+  name='FindCommitsResponse',
+  full_name='gitaly.FindCommitsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commits', full_name='gitaly.FindCommitsResponse.commits', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2355,
+  serialized_end=2412,
+)
+
+
+_COMMITLANGUAGESREQUEST = _descriptor.Descriptor(
+  name='CommitLanguagesRequest',
+  full_name='gitaly.CommitLanguagesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.CommitLanguagesRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.CommitLanguagesRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2414,
+  serialized_end=2496,
+)
+
+
+_COMMITLANGUAGESRESPONSE_LANGUAGE = _descriptor.Descriptor(
+  name='Language',
+  full_name='gitaly.CommitLanguagesResponse.Language',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gitaly.CommitLanguagesResponse.Language.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='share', full_name='gitaly.CommitLanguagesResponse.Language.share', index=1,
+      number=2, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='color', full_name='gitaly.CommitLanguagesResponse.Language.color', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2587,
+  serialized_end=2641,
+)
+
+_COMMITLANGUAGESRESPONSE = _descriptor.Descriptor(
+  name='CommitLanguagesResponse',
+  full_name='gitaly.CommitLanguagesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='languages', full_name='gitaly.CommitLanguagesResponse.languages', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[_COMMITLANGUAGESRESPONSE_LANGUAGE, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2499,
+  serialized_end=2641,
+)
+
+
+_RAWBLAMEREQUEST = _descriptor.Descriptor(
+  name='RawBlameRequest',
+  full_name='gitaly.RawBlameRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.RawBlameRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.RawBlameRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.RawBlameRequest.path', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2643,
+  serialized_end=2732,
+)
+
+
+_RAWBLAMERESPONSE = _descriptor.Descriptor(
+  name='RawBlameResponse',
+  full_name='gitaly.RawBlameResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='data', full_name='gitaly.RawBlameResponse.data', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2734,
+  serialized_end=2766,
+)
+
+
+_LASTCOMMITFORPATHREQUEST = _descriptor.Descriptor(
+  name='LastCommitForPathRequest',
+  full_name='gitaly.LastCommitForPathRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.LastCommitForPathRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.LastCommitForPathRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.LastCommitForPathRequest.path', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2768,
+  serialized_end=2866,
+)
+
+
+_LASTCOMMITFORPATHRESPONSE = _descriptor.Descriptor(
+  name='LastCommitForPathResponse',
+  full_name='gitaly.LastCommitForPathResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commit', full_name='gitaly.LastCommitForPathResponse.commit', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2868,
+  serialized_end=2930,
+)
+
+
+_COMMITSBYMESSAGEREQUEST = _descriptor.Descriptor(
+  name='CommitsByMessageRequest',
+  full_name='gitaly.CommitsByMessageRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.CommitsByMessageRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision', full_name='gitaly.CommitsByMessageRequest.revision', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='gitaly.CommitsByMessageRequest.offset', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='gitaly.CommitsByMessageRequest.limit', index=3,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.CommitsByMessageRequest.path', index=4,
+      number=5, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='query', full_name='gitaly.CommitsByMessageRequest.query', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2933,
+  serialized_end=3076,
+)
+
+
+_COMMITSBYMESSAGERESPONSE = _descriptor.Descriptor(
+  name='CommitsByMessageResponse',
+  full_name='gitaly.CommitsByMessageResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='commits', full_name='gitaly.CommitsByMessageResponse.commits', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3078,
+  serialized_end=3140,
+)
+
+
+_FILTERSHASWITHSIGNATURESREQUEST = _descriptor.Descriptor(
+  name='FilterShasWithSignaturesRequest',
+  full_name='gitaly.FilterShasWithSignaturesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.FilterShasWithSignaturesRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='shas', full_name='gitaly.FilterShasWithSignaturesRequest.shas', index=1,
+      number=2, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3142,
+  serialized_end=3229,
+)
+
+
+_FILTERSHASWITHSIGNATURESRESPONSE = _descriptor.Descriptor(
+  name='FilterShasWithSignaturesResponse',
+  full_name='gitaly.FilterShasWithSignaturesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='shas', full_name='gitaly.FilterShasWithSignaturesResponse.shas', index=0,
+      number=1, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3231,
+  serialized_end=3279,
+)
+
+
+_EXTRACTCOMMITSIGNATUREREQUEST = _descriptor.Descriptor(
+  name='ExtractCommitSignatureRequest',
+  full_name='gitaly.ExtractCommitSignatureRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='repository', full_name='gitaly.ExtractCommitSignatureRequest.repository', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='commit_id', full_name='gitaly.ExtractCommitSignatureRequest.commit_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3281,
+  serialized_end=3371,
+)
+
+
+_EXTRACTCOMMITSIGNATURERESPONSE = _descriptor.Descriptor(
+  name='ExtractCommitSignatureResponse',
+  full_name='gitaly.ExtractCommitSignatureResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='signature', full_name='gitaly.ExtractCommitSignatureResponse.signature', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='signed_text', full_name='gitaly.ExtractCommitSignatureResponse.signed_text', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3373,
+  serialized_end=3445,
+)
+
+_COMMITSTATSREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_COMMITISANCESTORREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_TREEENTRYREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_TREEENTRYRESPONSE.fields_by_name['type'].enum_type = _TREEENTRYRESPONSE_OBJECTTYPE
+_TREEENTRYRESPONSE_OBJECTTYPE.containing_type = _TREEENTRYRESPONSE
+_COMMITSBETWEENREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_COMMITSBETWEENRESPONSE.fields_by_name['commits'].message_type = shared__pb2._GITCOMMIT
+_COUNTCOMMITSREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_COUNTCOMMITSREQUEST.fields_by_name['after'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_COUNTCOMMITSREQUEST.fields_by_name['before'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_TREEENTRY.fields_by_name['type'].enum_type = _TREEENTRY_ENTRYTYPE
+_TREEENTRY_ENTRYTYPE.containing_type = _TREEENTRY
+_GETTREEENTRIESREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_GETTREEENTRIESRESPONSE.fields_by_name['entries'].message_type = _TREEENTRY
+_LISTFILESREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_FINDCOMMITREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_FINDCOMMITRESPONSE.fields_by_name['commit'].message_type = shared__pb2._GITCOMMIT
+_LISTCOMMITSBYOIDREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_LISTCOMMITSBYOIDRESPONSE.fields_by_name['commits'].message_type = shared__pb2._GITCOMMIT
+_FINDALLCOMMITSREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_FINDALLCOMMITSREQUEST.fields_by_name['order'].enum_type = _FINDALLCOMMITSREQUEST_ORDER
+_FINDALLCOMMITSREQUEST_ORDER.containing_type = _FINDALLCOMMITSREQUEST
+_FINDALLCOMMITSRESPONSE.fields_by_name['commits'].message_type = shared__pb2._GITCOMMIT
+_FINDCOMMITSREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_FINDCOMMITSREQUEST.fields_by_name['after'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_FINDCOMMITSREQUEST.fields_by_name['before'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_FINDCOMMITSRESPONSE.fields_by_name['commits'].message_type = shared__pb2._GITCOMMIT
+_COMMITLANGUAGESREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_COMMITLANGUAGESRESPONSE_LANGUAGE.containing_type = _COMMITLANGUAGESRESPONSE
+_COMMITLANGUAGESRESPONSE.fields_by_name['languages'].message_type = _COMMITLANGUAGESRESPONSE_LANGUAGE
+_RAWBLAMEREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_LASTCOMMITFORPATHREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_LASTCOMMITFORPATHRESPONSE.fields_by_name['commit'].message_type = shared__pb2._GITCOMMIT
+_COMMITSBYMESSAGEREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_COMMITSBYMESSAGERESPONSE.fields_by_name['commits'].message_type = shared__pb2._GITCOMMIT
+_FILTERSHASWITHSIGNATURESREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+_EXTRACTCOMMITSIGNATUREREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
+DESCRIPTOR.message_types_by_name['CommitStatsRequest'] = _COMMITSTATSREQUEST
+DESCRIPTOR.message_types_by_name['CommitStatsResponse'] = _COMMITSTATSRESPONSE
+DESCRIPTOR.message_types_by_name['CommitIsAncestorRequest'] = _COMMITISANCESTORREQUEST
+DESCRIPTOR.message_types_by_name['CommitIsAncestorResponse'] = _COMMITISANCESTORRESPONSE
+DESCRIPTOR.message_types_by_name['TreeEntryRequest'] = _TREEENTRYREQUEST
+DESCRIPTOR.message_types_by_name['TreeEntryResponse'] = _TREEENTRYRESPONSE
+DESCRIPTOR.message_types_by_name['CommitsBetweenRequest'] = _COMMITSBETWEENREQUEST
+DESCRIPTOR.message_types_by_name['CommitsBetweenResponse'] = _COMMITSBETWEENRESPONSE
+DESCRIPTOR.message_types_by_name['CountCommitsRequest'] = _COUNTCOMMITSREQUEST
+DESCRIPTOR.message_types_by_name['CountCommitsResponse'] = _COUNTCOMMITSRESPONSE
+DESCRIPTOR.message_types_by_name['TreeEntry'] = _TREEENTRY
+DESCRIPTOR.message_types_by_name['GetTreeEntriesRequest'] = _GETTREEENTRIESREQUEST
+DESCRIPTOR.message_types_by_name['GetTreeEntriesResponse'] = _GETTREEENTRIESRESPONSE
+DESCRIPTOR.message_types_by_name['ListFilesRequest'] = _LISTFILESREQUEST
+DESCRIPTOR.message_types_by_name['ListFilesResponse'] = _LISTFILESRESPONSE
+DESCRIPTOR.message_types_by_name['FindCommitRequest'] = _FINDCOMMITREQUEST
+DESCRIPTOR.message_types_by_name['FindCommitResponse'] = _FINDCOMMITRESPONSE
+DESCRIPTOR.message_types_by_name['ListCommitsByOidRequest'] = _LISTCOMMITSBYOIDREQUEST
+DESCRIPTOR.message_types_by_name['ListCommitsByOidResponse'] = _LISTCOMMITSBYOIDRESPONSE
+DESCRIPTOR.message_types_by_name['FindAllCommitsRequest'] = _FINDALLCOMMITSREQUEST
+DESCRIPTOR.message_types_by_name['FindAllCommitsResponse'] = _FINDALLCOMMITSRESPONSE
+DESCRIPTOR.message_types_by_name['FindCommitsRequest'] = _FINDCOMMITSREQUEST
+DESCRIPTOR.message_types_by_name['FindCommitsResponse'] = _FINDCOMMITSRESPONSE
+DESCRIPTOR.message_types_by_name['CommitLanguagesRequest'] = _COMMITLANGUAGESREQUEST
+DESCRIPTOR.message_types_by_name['CommitLanguagesResponse'] = _COMMITLANGUAGESRESPONSE
+DESCRIPTOR.message_types_by_name['RawBlameRequest'] = _RAWBLAMEREQUEST
+DESCRIPTOR.message_types_by_name['RawBlameResponse'] = _RAWBLAMERESPONSE
+DESCRIPTOR.message_types_by_name['LastCommitForPathRequest'] = _LASTCOMMITFORPATHREQUEST
+DESCRIPTOR.message_types_by_name['LastCommitForPathResponse'] = _LASTCOMMITFORPATHRESPONSE
+DESCRIPTOR.message_types_by_name['CommitsByMessageRequest'] = _COMMITSBYMESSAGEREQUEST
+DESCRIPTOR.message_types_by_name['CommitsByMessageResponse'] = _COMMITSBYMESSAGERESPONSE
+DESCRIPTOR.message_types_by_name['FilterShasWithSignaturesRequest'] = _FILTERSHASWITHSIGNATURESREQUEST
+DESCRIPTOR.message_types_by_name['FilterShasWithSignaturesResponse'] = _FILTERSHASWITHSIGNATURESRESPONSE
+DESCRIPTOR.message_types_by_name['ExtractCommitSignatureRequest'] = _EXTRACTCOMMITSIGNATUREREQUEST
+DESCRIPTOR.message_types_by_name['ExtractCommitSignatureResponse'] = _EXTRACTCOMMITSIGNATURERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CommitStatsRequest = _reflection.GeneratedProtocolMessageType('CommitStatsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITSTATSREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitStatsRequest)
+  })
+_sym_db.RegisterMessage(CommitStatsRequest)
+
+CommitStatsResponse = _reflection.GeneratedProtocolMessageType('CommitStatsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITSTATSRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitStatsResponse)
+  })
+_sym_db.RegisterMessage(CommitStatsResponse)
+
+CommitIsAncestorRequest = _reflection.GeneratedProtocolMessageType('CommitIsAncestorRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITISANCESTORREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitIsAncestorRequest)
+  })
+_sym_db.RegisterMessage(CommitIsAncestorRequest)
+
+CommitIsAncestorResponse = _reflection.GeneratedProtocolMessageType('CommitIsAncestorResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITISANCESTORRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitIsAncestorResponse)
+  })
+_sym_db.RegisterMessage(CommitIsAncestorResponse)
+
+TreeEntryRequest = _reflection.GeneratedProtocolMessageType('TreeEntryRequest', (_message.Message,), {
+  'DESCRIPTOR' : _TREEENTRYREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.TreeEntryRequest)
+  })
+_sym_db.RegisterMessage(TreeEntryRequest)
+
+TreeEntryResponse = _reflection.GeneratedProtocolMessageType('TreeEntryResponse', (_message.Message,), {
+  'DESCRIPTOR' : _TREEENTRYRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.TreeEntryResponse)
+  })
+_sym_db.RegisterMessage(TreeEntryResponse)
+
+CommitsBetweenRequest = _reflection.GeneratedProtocolMessageType('CommitsBetweenRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITSBETWEENREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitsBetweenRequest)
+  })
+_sym_db.RegisterMessage(CommitsBetweenRequest)
+
+CommitsBetweenResponse = _reflection.GeneratedProtocolMessageType('CommitsBetweenResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITSBETWEENRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitsBetweenResponse)
+  })
+_sym_db.RegisterMessage(CommitsBetweenResponse)
+
+CountCommitsRequest = _reflection.GeneratedProtocolMessageType('CountCommitsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COUNTCOMMITSREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CountCommitsRequest)
+  })
+_sym_db.RegisterMessage(CountCommitsRequest)
+
+CountCommitsResponse = _reflection.GeneratedProtocolMessageType('CountCommitsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COUNTCOMMITSRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CountCommitsResponse)
+  })
+_sym_db.RegisterMessage(CountCommitsResponse)
+
+TreeEntry = _reflection.GeneratedProtocolMessageType('TreeEntry', (_message.Message,), {
+  'DESCRIPTOR' : _TREEENTRY,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.TreeEntry)
+  })
+_sym_db.RegisterMessage(TreeEntry)
+
+GetTreeEntriesRequest = _reflection.GeneratedProtocolMessageType('GetTreeEntriesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTREEENTRIESREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.GetTreeEntriesRequest)
+  })
+_sym_db.RegisterMessage(GetTreeEntriesRequest)
+
+GetTreeEntriesResponse = _reflection.GeneratedProtocolMessageType('GetTreeEntriesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETTREEENTRIESRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.GetTreeEntriesResponse)
+  })
+_sym_db.RegisterMessage(GetTreeEntriesResponse)
+
+ListFilesRequest = _reflection.GeneratedProtocolMessageType('ListFilesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTFILESREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ListFilesRequest)
+  })
+_sym_db.RegisterMessage(ListFilesRequest)
+
+ListFilesResponse = _reflection.GeneratedProtocolMessageType('ListFilesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTFILESRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ListFilesResponse)
+  })
+_sym_db.RegisterMessage(ListFilesResponse)
+
+FindCommitRequest = _reflection.GeneratedProtocolMessageType('FindCommitRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDCOMMITREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FindCommitRequest)
+  })
+_sym_db.RegisterMessage(FindCommitRequest)
+
+FindCommitResponse = _reflection.GeneratedProtocolMessageType('FindCommitResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDCOMMITRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FindCommitResponse)
+  })
+_sym_db.RegisterMessage(FindCommitResponse)
+
+ListCommitsByOidRequest = _reflection.GeneratedProtocolMessageType('ListCommitsByOidRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOMMITSBYOIDREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ListCommitsByOidRequest)
+  })
+_sym_db.RegisterMessage(ListCommitsByOidRequest)
+
+ListCommitsByOidResponse = _reflection.GeneratedProtocolMessageType('ListCommitsByOidResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOMMITSBYOIDRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ListCommitsByOidResponse)
+  })
+_sym_db.RegisterMessage(ListCommitsByOidResponse)
+
+FindAllCommitsRequest = _reflection.GeneratedProtocolMessageType('FindAllCommitsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDALLCOMMITSREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FindAllCommitsRequest)
+  })
+_sym_db.RegisterMessage(FindAllCommitsRequest)
+
+FindAllCommitsResponse = _reflection.GeneratedProtocolMessageType('FindAllCommitsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDALLCOMMITSRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FindAllCommitsResponse)
+  })
+_sym_db.RegisterMessage(FindAllCommitsResponse)
+
+FindCommitsRequest = _reflection.GeneratedProtocolMessageType('FindCommitsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDCOMMITSREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FindCommitsRequest)
+  })
+_sym_db.RegisterMessage(FindCommitsRequest)
+
+FindCommitsResponse = _reflection.GeneratedProtocolMessageType('FindCommitsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDCOMMITSRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FindCommitsResponse)
+  })
+_sym_db.RegisterMessage(FindCommitsResponse)
+
+CommitLanguagesRequest = _reflection.GeneratedProtocolMessageType('CommitLanguagesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITLANGUAGESREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitLanguagesRequest)
+  })
+_sym_db.RegisterMessage(CommitLanguagesRequest)
+
+CommitLanguagesResponse = _reflection.GeneratedProtocolMessageType('CommitLanguagesResponse', (_message.Message,), {
+
+  'Language' : _reflection.GeneratedProtocolMessageType('Language', (_message.Message,), {
+    'DESCRIPTOR' : _COMMITLANGUAGESRESPONSE_LANGUAGE,
+    '__module__' : 'commit_pb2'
+    # @@protoc_insertion_point(class_scope:gitaly.CommitLanguagesResponse.Language)
+    })
+  ,
+  'DESCRIPTOR' : _COMMITLANGUAGESRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitLanguagesResponse)
+  })
+_sym_db.RegisterMessage(CommitLanguagesResponse)
+_sym_db.RegisterMessage(CommitLanguagesResponse.Language)
+
+RawBlameRequest = _reflection.GeneratedProtocolMessageType('RawBlameRequest', (_message.Message,), {
+  'DESCRIPTOR' : _RAWBLAMEREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.RawBlameRequest)
+  })
+_sym_db.RegisterMessage(RawBlameRequest)
+
+RawBlameResponse = _reflection.GeneratedProtocolMessageType('RawBlameResponse', (_message.Message,), {
+  'DESCRIPTOR' : _RAWBLAMERESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.RawBlameResponse)
+  })
+_sym_db.RegisterMessage(RawBlameResponse)
+
+LastCommitForPathRequest = _reflection.GeneratedProtocolMessageType('LastCommitForPathRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LASTCOMMITFORPATHREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.LastCommitForPathRequest)
+  })
+_sym_db.RegisterMessage(LastCommitForPathRequest)
+
+LastCommitForPathResponse = _reflection.GeneratedProtocolMessageType('LastCommitForPathResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LASTCOMMITFORPATHRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.LastCommitForPathResponse)
+  })
+_sym_db.RegisterMessage(LastCommitForPathResponse)
+
+CommitsByMessageRequest = _reflection.GeneratedProtocolMessageType('CommitsByMessageRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITSBYMESSAGEREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitsByMessageRequest)
+  })
+_sym_db.RegisterMessage(CommitsByMessageRequest)
+
+CommitsByMessageResponse = _reflection.GeneratedProtocolMessageType('CommitsByMessageResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITSBYMESSAGERESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitsByMessageResponse)
+  })
+_sym_db.RegisterMessage(CommitsByMessageResponse)
+
+FilterShasWithSignaturesRequest = _reflection.GeneratedProtocolMessageType('FilterShasWithSignaturesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FILTERSHASWITHSIGNATURESREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FilterShasWithSignaturesRequest)
+  })
+_sym_db.RegisterMessage(FilterShasWithSignaturesRequest)
+
+FilterShasWithSignaturesResponse = _reflection.GeneratedProtocolMessageType('FilterShasWithSignaturesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FILTERSHASWITHSIGNATURESRESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.FilterShasWithSignaturesResponse)
+  })
+_sym_db.RegisterMessage(FilterShasWithSignaturesResponse)
+
+ExtractCommitSignatureRequest = _reflection.GeneratedProtocolMessageType('ExtractCommitSignatureRequest', (_message.Message,), {
+  'DESCRIPTOR' : _EXTRACTCOMMITSIGNATUREREQUEST,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ExtractCommitSignatureRequest)
+  })
+_sym_db.RegisterMessage(ExtractCommitSignatureRequest)
+
+ExtractCommitSignatureResponse = _reflection.GeneratedProtocolMessageType('ExtractCommitSignatureResponse', (_message.Message,), {
+  'DESCRIPTOR' : _EXTRACTCOMMITSIGNATURERESPONSE,
+  '__module__' : 'commit_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ExtractCommitSignatureResponse)
+  })
+_sym_db.RegisterMessage(ExtractCommitSignatureResponse)
+
+
+
+_COMMITSERVICE = _descriptor.ServiceDescriptor(
+  name='CommitService',
+  full_name='gitaly.CommitService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=3448,
+  serialized_end=4898,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='CommitIsAncestor',
+    full_name='gitaly.CommitService.CommitIsAncestor',
+    index=0,
+    containing_service=None,
+    input_type=_COMMITISANCESTORREQUEST,
+    output_type=_COMMITISANCESTORRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='TreeEntry',
+    full_name='gitaly.CommitService.TreeEntry',
+    index=1,
+    containing_service=None,
+    input_type=_TREEENTRYREQUEST,
+    output_type=_TREEENTRYRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CommitsBetween',
+    full_name='gitaly.CommitService.CommitsBetween',
+    index=2,
+    containing_service=None,
+    input_type=_COMMITSBETWEENREQUEST,
+    output_type=_COMMITSBETWEENRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CountCommits',
+    full_name='gitaly.CommitService.CountCommits',
+    index=3,
+    containing_service=None,
+    input_type=_COUNTCOMMITSREQUEST,
+    output_type=_COUNTCOMMITSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetTreeEntries',
+    full_name='gitaly.CommitService.GetTreeEntries',
+    index=4,
+    containing_service=None,
+    input_type=_GETTREEENTRIESREQUEST,
+    output_type=_GETTREEENTRIESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListFiles',
+    full_name='gitaly.CommitService.ListFiles',
+    index=5,
+    containing_service=None,
+    input_type=_LISTFILESREQUEST,
+    output_type=_LISTFILESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindCommit',
+    full_name='gitaly.CommitService.FindCommit',
+    index=6,
+    containing_service=None,
+    input_type=_FINDCOMMITREQUEST,
+    output_type=_FINDCOMMITRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CommitStats',
+    full_name='gitaly.CommitService.CommitStats',
+    index=7,
+    containing_service=None,
+    input_type=_COMMITSTATSREQUEST,
+    output_type=_COMMITSTATSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindAllCommits',
+    full_name='gitaly.CommitService.FindAllCommits',
+    index=8,
+    containing_service=None,
+    input_type=_FINDALLCOMMITSREQUEST,
+    output_type=_FINDALLCOMMITSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindCommits',
+    full_name='gitaly.CommitService.FindCommits',
+    index=9,
+    containing_service=None,
+    input_type=_FINDCOMMITSREQUEST,
+    output_type=_FINDCOMMITSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CommitLanguages',
+    full_name='gitaly.CommitService.CommitLanguages',
+    index=10,
+    containing_service=None,
+    input_type=_COMMITLANGUAGESREQUEST,
+    output_type=_COMMITLANGUAGESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RawBlame',
+    full_name='gitaly.CommitService.RawBlame',
+    index=11,
+    containing_service=None,
+    input_type=_RAWBLAMEREQUEST,
+    output_type=_RAWBLAMERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='LastCommitForPath',
+    full_name='gitaly.CommitService.LastCommitForPath',
+    index=12,
+    containing_service=None,
+    input_type=_LASTCOMMITFORPATHREQUEST,
+    output_type=_LASTCOMMITFORPATHRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CommitsByMessage',
+    full_name='gitaly.CommitService.CommitsByMessage',
+    index=13,
+    containing_service=None,
+    input_type=_COMMITSBYMESSAGEREQUEST,
+    output_type=_COMMITSBYMESSAGERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListCommitsByOid',
+    full_name='gitaly.CommitService.ListCommitsByOid',
+    index=14,
+    containing_service=None,
+    input_type=_LISTCOMMITSBYOIDREQUEST,
+    output_type=_LISTCOMMITSBYOIDRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FilterShasWithSignatures',
+    full_name='gitaly.CommitService.FilterShasWithSignatures',
+    index=15,
+    containing_service=None,
+    input_type=_FILTERSHASWITHSIGNATURESREQUEST,
+    output_type=_FILTERSHASWITHSIGNATURESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ExtractCommitSignature',
+    full_name='gitaly.CommitService.ExtractCommitSignature',
+    index=16,
+    containing_service=None,
+    input_type=_EXTRACTCOMMITSIGNATUREREQUEST,
+    output_type=_EXTRACTCOMMITSIGNATURERESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_COMMITSERVICE)
+
+DESCRIPTOR.services_by_name['CommitService'] = _COMMITSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/hgitaly/stub/commit_pb2_grpc.py b/hgitaly/stub/commit_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..7196784b950a3b3258e1dcb84af7c2986868cb53_aGdpdGFseS9zdHViL2NvbW1pdF9wYjJfZ3JwYy5weQ==
--- /dev/null
+++ b/hgitaly/stub/commit_pb2_grpc.py
@@ -0,0 +1,322 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+# TODO had to modify this manually. Find a way to have grpcio-tools
+# to generate such explicit relative imports or just switch to non-absolute
+from . import commit_pb2 as commit__pb2
+
+
+class CommitServiceStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.CommitIsAncestor = channel.unary_unary(
+        '/gitaly.CommitService/CommitIsAncestor',
+        request_serializer=commit__pb2.CommitIsAncestorRequest.SerializeToString,
+        response_deserializer=commit__pb2.CommitIsAncestorResponse.FromString,
+        )
+    self.TreeEntry = channel.unary_stream(
+        '/gitaly.CommitService/TreeEntry',
+        request_serializer=commit__pb2.TreeEntryRequest.SerializeToString,
+        response_deserializer=commit__pb2.TreeEntryResponse.FromString,
+        )
+    self.CommitsBetween = channel.unary_stream(
+        '/gitaly.CommitService/CommitsBetween',
+        request_serializer=commit__pb2.CommitsBetweenRequest.SerializeToString,
+        response_deserializer=commit__pb2.CommitsBetweenResponse.FromString,
+        )
+    self.CountCommits = channel.unary_unary(
+        '/gitaly.CommitService/CountCommits',
+        request_serializer=commit__pb2.CountCommitsRequest.SerializeToString,
+        response_deserializer=commit__pb2.CountCommitsResponse.FromString,
+        )
+    self.GetTreeEntries = channel.unary_stream(
+        '/gitaly.CommitService/GetTreeEntries',
+        request_serializer=commit__pb2.GetTreeEntriesRequest.SerializeToString,
+        response_deserializer=commit__pb2.GetTreeEntriesResponse.FromString,
+        )
+    self.ListFiles = channel.unary_stream(
+        '/gitaly.CommitService/ListFiles',
+        request_serializer=commit__pb2.ListFilesRequest.SerializeToString,
+        response_deserializer=commit__pb2.ListFilesResponse.FromString,
+        )
+    self.FindCommit = channel.unary_unary(
+        '/gitaly.CommitService/FindCommit',
+        request_serializer=commit__pb2.FindCommitRequest.SerializeToString,
+        response_deserializer=commit__pb2.FindCommitResponse.FromString,
+        )
+    self.CommitStats = channel.unary_unary(
+        '/gitaly.CommitService/CommitStats',
+        request_serializer=commit__pb2.CommitStatsRequest.SerializeToString,
+        response_deserializer=commit__pb2.CommitStatsResponse.FromString,
+        )
+    self.FindAllCommits = channel.unary_stream(
+        '/gitaly.CommitService/FindAllCommits',
+        request_serializer=commit__pb2.FindAllCommitsRequest.SerializeToString,
+        response_deserializer=commit__pb2.FindAllCommitsResponse.FromString,
+        )
+    self.FindCommits = channel.unary_stream(
+        '/gitaly.CommitService/FindCommits',
+        request_serializer=commit__pb2.FindCommitsRequest.SerializeToString,
+        response_deserializer=commit__pb2.FindCommitsResponse.FromString,
+        )
+    self.CommitLanguages = channel.unary_unary(
+        '/gitaly.CommitService/CommitLanguages',
+        request_serializer=commit__pb2.CommitLanguagesRequest.SerializeToString,
+        response_deserializer=commit__pb2.CommitLanguagesResponse.FromString,
+        )
+    self.RawBlame = channel.unary_stream(
+        '/gitaly.CommitService/RawBlame',
+        request_serializer=commit__pb2.RawBlameRequest.SerializeToString,
+        response_deserializer=commit__pb2.RawBlameResponse.FromString,
+        )
+    self.LastCommitForPath = channel.unary_unary(
+        '/gitaly.CommitService/LastCommitForPath',
+        request_serializer=commit__pb2.LastCommitForPathRequest.SerializeToString,
+        response_deserializer=commit__pb2.LastCommitForPathResponse.FromString,
+        )
+    self.CommitsByMessage = channel.unary_stream(
+        '/gitaly.CommitService/CommitsByMessage',
+        request_serializer=commit__pb2.CommitsByMessageRequest.SerializeToString,
+        response_deserializer=commit__pb2.CommitsByMessageResponse.FromString,
+        )
+    self.ListCommitsByOid = channel.unary_stream(
+        '/gitaly.CommitService/ListCommitsByOid',
+        request_serializer=commit__pb2.ListCommitsByOidRequest.SerializeToString,
+        response_deserializer=commit__pb2.ListCommitsByOidResponse.FromString,
+        )
+    self.FilterShasWithSignatures = channel.stream_stream(
+        '/gitaly.CommitService/FilterShasWithSignatures',
+        request_serializer=commit__pb2.FilterShasWithSignaturesRequest.SerializeToString,
+        response_deserializer=commit__pb2.FilterShasWithSignaturesResponse.FromString,
+        )
+    self.ExtractCommitSignature = channel.unary_stream(
+        '/gitaly.CommitService/ExtractCommitSignature',
+        request_serializer=commit__pb2.ExtractCommitSignatureRequest.SerializeToString,
+        response_deserializer=commit__pb2.ExtractCommitSignatureResponse.FromString,
+        )
+
+
+class CommitServiceServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def CommitIsAncestor(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def TreeEntry(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def CommitsBetween(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def CountCommits(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetTreeEntries(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ListFiles(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def FindCommit(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def CommitStats(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def FindAllCommits(self, request, context):
+    """Use a stream to paginate the result set
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def FindCommits(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def CommitLanguages(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def RawBlame(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def LastCommitForPath(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def CommitsByMessage(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ListCommitsByOid(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def FilterShasWithSignatures(self, request_iterator, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ExtractCommitSignature(self, request, context):
+    """ExtractCommitSignature returns a stream because the signed text may be
+    arbitrarily large and signature verification is impossible without the
+    full text.
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_CommitServiceServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'CommitIsAncestor': grpc.unary_unary_rpc_method_handler(
+          servicer.CommitIsAncestor,
+          request_deserializer=commit__pb2.CommitIsAncestorRequest.FromString,
+          response_serializer=commit__pb2.CommitIsAncestorResponse.SerializeToString,
+      ),
+      'TreeEntry': grpc.unary_stream_rpc_method_handler(
+          servicer.TreeEntry,
+          request_deserializer=commit__pb2.TreeEntryRequest.FromString,
+          response_serializer=commit__pb2.TreeEntryResponse.SerializeToString,
+      ),
+      'CommitsBetween': grpc.unary_stream_rpc_method_handler(
+          servicer.CommitsBetween,
+          request_deserializer=commit__pb2.CommitsBetweenRequest.FromString,
+          response_serializer=commit__pb2.CommitsBetweenResponse.SerializeToString,
+      ),
+      'CountCommits': grpc.unary_unary_rpc_method_handler(
+          servicer.CountCommits,
+          request_deserializer=commit__pb2.CountCommitsRequest.FromString,
+          response_serializer=commit__pb2.CountCommitsResponse.SerializeToString,
+      ),
+      'GetTreeEntries': grpc.unary_stream_rpc_method_handler(
+          servicer.GetTreeEntries,
+          request_deserializer=commit__pb2.GetTreeEntriesRequest.FromString,
+          response_serializer=commit__pb2.GetTreeEntriesResponse.SerializeToString,
+      ),
+      'ListFiles': grpc.unary_stream_rpc_method_handler(
+          servicer.ListFiles,
+          request_deserializer=commit__pb2.ListFilesRequest.FromString,
+          response_serializer=commit__pb2.ListFilesResponse.SerializeToString,
+      ),
+      'FindCommit': grpc.unary_unary_rpc_method_handler(
+          servicer.FindCommit,
+          request_deserializer=commit__pb2.FindCommitRequest.FromString,
+          response_serializer=commit__pb2.FindCommitResponse.SerializeToString,
+      ),
+      'CommitStats': grpc.unary_unary_rpc_method_handler(
+          servicer.CommitStats,
+          request_deserializer=commit__pb2.CommitStatsRequest.FromString,
+          response_serializer=commit__pb2.CommitStatsResponse.SerializeToString,
+      ),
+      'FindAllCommits': grpc.unary_stream_rpc_method_handler(
+          servicer.FindAllCommits,
+          request_deserializer=commit__pb2.FindAllCommitsRequest.FromString,
+          response_serializer=commit__pb2.FindAllCommitsResponse.SerializeToString,
+      ),
+      'FindCommits': grpc.unary_stream_rpc_method_handler(
+          servicer.FindCommits,
+          request_deserializer=commit__pb2.FindCommitsRequest.FromString,
+          response_serializer=commit__pb2.FindCommitsResponse.SerializeToString,
+      ),
+      'CommitLanguages': grpc.unary_unary_rpc_method_handler(
+          servicer.CommitLanguages,
+          request_deserializer=commit__pb2.CommitLanguagesRequest.FromString,
+          response_serializer=commit__pb2.CommitLanguagesResponse.SerializeToString,
+      ),
+      'RawBlame': grpc.unary_stream_rpc_method_handler(
+          servicer.RawBlame,
+          request_deserializer=commit__pb2.RawBlameRequest.FromString,
+          response_serializer=commit__pb2.RawBlameResponse.SerializeToString,
+      ),
+      'LastCommitForPath': grpc.unary_unary_rpc_method_handler(
+          servicer.LastCommitForPath,
+          request_deserializer=commit__pb2.LastCommitForPathRequest.FromString,
+          response_serializer=commit__pb2.LastCommitForPathResponse.SerializeToString,
+      ),
+      'CommitsByMessage': grpc.unary_stream_rpc_method_handler(
+          servicer.CommitsByMessage,
+          request_deserializer=commit__pb2.CommitsByMessageRequest.FromString,
+          response_serializer=commit__pb2.CommitsByMessageResponse.SerializeToString,
+      ),
+      'ListCommitsByOid': grpc.unary_stream_rpc_method_handler(
+          servicer.ListCommitsByOid,
+          request_deserializer=commit__pb2.ListCommitsByOidRequest.FromString,
+          response_serializer=commit__pb2.ListCommitsByOidResponse.SerializeToString,
+      ),
+      'FilterShasWithSignatures': grpc.stream_stream_rpc_method_handler(
+          servicer.FilterShasWithSignatures,
+          request_deserializer=commit__pb2.FilterShasWithSignaturesRequest.FromString,
+          response_serializer=commit__pb2.FilterShasWithSignaturesResponse.SerializeToString,
+      ),
+      'ExtractCommitSignature': grpc.unary_stream_rpc_method_handler(
+          servicer.ExtractCommitSignature,
+          request_deserializer=commit__pb2.ExtractCommitSignatureRequest.FromString,
+          response_serializer=commit__pb2.ExtractCommitSignatureResponse.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'gitaly.CommitService', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/hgitaly/stub/shared_pb2.py b/hgitaly/stub/shared_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..7196784b950a3b3258e1dcb84af7c2986868cb53_aGdpdGFseS9zdHViL3NoYXJlZF9wYjIucHk=
--- /dev/null
+++ b/hgitaly/stub/shared_pb2.py
@@ -0,0 +1,437 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: shared.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='shared.proto',
+  package='gitaly',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x0cshared.proto\x12\x06gitaly\x1a\x1fgoogle/protobuf/timestamp.proto\"\xa4\x01\n\nRepository\x12\x14\n\x0cstorage_name\x18\x02 \x01(\t\x12\x15\n\rrelative_path\x18\x03 \x01(\t\x12\x1c\n\x14git_object_directory\x18\x04 \x01(\t\x12(\n git_alternate_object_directories\x18\x05 \x03(\t\x12\x15\n\rgl_repository\x18\x06 \x01(\tJ\x04\x08\x01\x10\x02R\x04path\"\x99\x01\n\tGitCommit\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\x0c\x12\x0c\n\x04\x62ody\x18\x03 \x01(\x0c\x12$\n\x06\x61uthor\x18\x04 \x01(\x0b\x32\x14.gitaly.CommitAuthor\x12\'\n\tcommitter\x18\x05 \x01(\x0b\x32\x14.gitaly.CommitAuthor\x12\x12\n\nparent_ids\x18\x06 \x03(\t\"U\n\x0c\x43ommitAuthor\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\r\n\x05\x65mail\x18\x02 \x01(\x0c\x12(\n\x04\x64\x61te\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x1b\n\nExitStatus\x12\r\n\x05value\x18\x01 \x01(\x05\"@\n\x06\x42ranch\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12(\n\rtarget_commit\x18\x02 \x01(\x0b\x32\x11.gitaly.GitCommit\"Z\n\x03Tag\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\n\n\x02id\x18\x02 \x01(\t\x12(\n\rtarget_commit\x18\x03 \x01(\x0b\x32\x11.gitaly.GitCommit\x12\x0f\n\x07message\x18\x04 \x01(\x0c\"G\n\x04User\x12\r\n\x05gl_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\x0c\x12\r\n\x05\x65mail\x18\x03 \x01(\x0c\x12\x13\n\x0bgl_username\x18\x04 \x01(\tb\x06proto3')
+  ,
+  dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
+
+
+
+
+_REPOSITORY = _descriptor.Descriptor(
+  name='Repository',
+  full_name='gitaly.Repository',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='storage_name', full_name='gitaly.Repository.storage_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='relative_path', full_name='gitaly.Repository.relative_path', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='git_object_directory', full_name='gitaly.Repository.git_object_directory', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='git_alternate_object_directories', full_name='gitaly.Repository.git_alternate_object_directories', index=3,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='gl_repository', full_name='gitaly.Repository.gl_repository', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=58,
+  serialized_end=222,
+)
+
+
+_GITCOMMIT = _descriptor.Descriptor(
+  name='GitCommit',
+  full_name='gitaly.GitCommit',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='gitaly.GitCommit.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='subject', full_name='gitaly.GitCommit.subject', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='body', full_name='gitaly.GitCommit.body', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='author', full_name='gitaly.GitCommit.author', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='committer', full_name='gitaly.GitCommit.committer', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='parent_ids', full_name='gitaly.GitCommit.parent_ids', index=5,
+      number=6, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=225,
+  serialized_end=378,
+)
+
+
+_COMMITAUTHOR = _descriptor.Descriptor(
+  name='CommitAuthor',
+  full_name='gitaly.CommitAuthor',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gitaly.CommitAuthor.name', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='gitaly.CommitAuthor.email', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='date', full_name='gitaly.CommitAuthor.date', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=380,
+  serialized_end=465,
+)
+
+
+_EXITSTATUS = _descriptor.Descriptor(
+  name='ExitStatus',
+  full_name='gitaly.ExitStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='value', full_name='gitaly.ExitStatus.value', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=467,
+  serialized_end=494,
+)
+
+
+_BRANCH = _descriptor.Descriptor(
+  name='Branch',
+  full_name='gitaly.Branch',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gitaly.Branch.name', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='target_commit', full_name='gitaly.Branch.target_commit', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=496,
+  serialized_end=560,
+)
+
+
+_TAG = _descriptor.Descriptor(
+  name='Tag',
+  full_name='gitaly.Tag',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gitaly.Tag.name', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='gitaly.Tag.id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='target_commit', full_name='gitaly.Tag.target_commit', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='message', full_name='gitaly.Tag.message', index=3,
+      number=4, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=562,
+  serialized_end=652,
+)
+
+
+_USER = _descriptor.Descriptor(
+  name='User',
+  full_name='gitaly.User',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='gl_id', full_name='gitaly.User.gl_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gitaly.User.name', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='gitaly.User.email', index=2,
+      number=3, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='gl_username', full_name='gitaly.User.gl_username', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=654,
+  serialized_end=725,
+)
+
+_GITCOMMIT.fields_by_name['author'].message_type = _COMMITAUTHOR
+_GITCOMMIT.fields_by_name['committer'].message_type = _COMMITAUTHOR
+_COMMITAUTHOR.fields_by_name['date'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_BRANCH.fields_by_name['target_commit'].message_type = _GITCOMMIT
+_TAG.fields_by_name['target_commit'].message_type = _GITCOMMIT
+DESCRIPTOR.message_types_by_name['Repository'] = _REPOSITORY
+DESCRIPTOR.message_types_by_name['GitCommit'] = _GITCOMMIT
+DESCRIPTOR.message_types_by_name['CommitAuthor'] = _COMMITAUTHOR
+DESCRIPTOR.message_types_by_name['ExitStatus'] = _EXITSTATUS
+DESCRIPTOR.message_types_by_name['Branch'] = _BRANCH
+DESCRIPTOR.message_types_by_name['Tag'] = _TAG
+DESCRIPTOR.message_types_by_name['User'] = _USER
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Repository = _reflection.GeneratedProtocolMessageType('Repository', (_message.Message,), {
+  'DESCRIPTOR' : _REPOSITORY,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.Repository)
+  })
+_sym_db.RegisterMessage(Repository)
+
+GitCommit = _reflection.GeneratedProtocolMessageType('GitCommit', (_message.Message,), {
+  'DESCRIPTOR' : _GITCOMMIT,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.GitCommit)
+  })
+_sym_db.RegisterMessage(GitCommit)
+
+CommitAuthor = _reflection.GeneratedProtocolMessageType('CommitAuthor', (_message.Message,), {
+  'DESCRIPTOR' : _COMMITAUTHOR,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.CommitAuthor)
+  })
+_sym_db.RegisterMessage(CommitAuthor)
+
+ExitStatus = _reflection.GeneratedProtocolMessageType('ExitStatus', (_message.Message,), {
+  'DESCRIPTOR' : _EXITSTATUS,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.ExitStatus)
+  })
+_sym_db.RegisterMessage(ExitStatus)
+
+Branch = _reflection.GeneratedProtocolMessageType('Branch', (_message.Message,), {
+  'DESCRIPTOR' : _BRANCH,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.Branch)
+  })
+_sym_db.RegisterMessage(Branch)
+
+Tag = _reflection.GeneratedProtocolMessageType('Tag', (_message.Message,), {
+  'DESCRIPTOR' : _TAG,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.Tag)
+  })
+_sym_db.RegisterMessage(Tag)
+
+User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), {
+  'DESCRIPTOR' : _USER,
+  '__module__' : 'shared_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.User)
+  })
+_sym_db.RegisterMessage(User)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/hgitaly/stub/shared_pb2_grpc.py b/hgitaly/stub/shared_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..7196784b950a3b3258e1dcb84af7c2986868cb53_aGdpdGFseS9zdHViL3NoYXJlZF9wYjJfZ3JwYy5weQ==
--- /dev/null
+++ b/hgitaly/stub/shared_pb2_grpc.py
@@ -0,0 +1,3 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+