diff --git a/hgitaly/stub/errors_pb2.py b/hgitaly/stub/errors_pb2.py
index 4afe074f4af566aab0259560e94729ce9e7e8681_aGdpdGFseS9zdHViL2Vycm9yc19wYjIucHk=..2fe1bbabf00a52e71d2b99e3dfad51c7f535eb02_aGdpdGFseS9zdHViL2Vycm9yc19wYjIucHk= 100644
--- a/hgitaly/stub/errors_pb2.py
+++ b/hgitaly/stub/errors_pb2.py
@@ -20,9 +20,9 @@
   syntax='proto3',
   serialized_options=b'Z2gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x0c\x65rrors.proto\x12\x06gitaly\x1a\x1egoogle/protobuf/duration.proto\"]\n\x10\x41\x63\x63\x65ssCheckError\x12\x15\n\rerror_message\x18\x01 \x01(\t\x12\x10\n\x08protocol\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x0f\n\x07\x63hanges\x18\x04 \x01(\x0c\"%\n\x15InvalidRefFormatError\x12\x0c\n\x04refs\x18\x02 \x03(\x0c\"C\n\x10NotAncestorError\x12\x17\n\x0fparent_revision\x18\x01 \x01(\x0c\x12\x16\n\x0e\x63hild_revision\x18\x02 \x01(\x0c\"\x1c\n\x1a\x43hangesAlreadyAppliedError\"O\n\x12MergeConflictError\x12\x19\n\x11\x63onflicting_files\x18\x01 \x03(\x0c\x12\x1e\n\x16\x63onflicting_commit_ids\x18\x02 \x03(\t\"%\n\x15ReferencesLockedError\x12\x0c\n\x04refs\x18\x01 \x03(\x0c\";\n\x14ReferenceExistsError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\x12\x0b\n\x03oid\x18\x02 \x01(\t\"0\n\x16ReferenceNotFoundError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\"P\n\x14ReferenceUpdateError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\x12\x0f\n\x07old_oid\x18\x02 \x01(\t\x12\x0f\n\x07new_oid\x18\x03 \x01(\t\"(\n\x14ResolveRevisionError\x12\x10\n\x08revision\x18\x01 \x01(\x0c\"S\n\nLimitError\x12\x15\n\rerror_message\x18\x01 \x01(\t\x12.\n\x0bretry_after\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\xd8\x01\n\x0f\x43ustomHookError\x12\x0e\n\x06stdout\x18\x01 \x01(\x0c\x12\x0e\n\x06stderr\x18\x02 \x01(\x0c\x12\x33\n\thook_type\x18\x03 \x01(\x0e\x32 .gitaly.CustomHookError.HookType\"p\n\x08HookType\x12\x19\n\x15HOOK_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14HOOK_TYPE_PRERECEIVE\x10\x01\x12\x14\n\x10HOOK_TYPE_UPDATE\x10\x02\x12\x19\n\x15HOOK_TYPE_POSTRECEIVE\x10\x03\x42\x34Z2gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypbb\x06proto3'
+  serialized_pb=b'\n\x0c\x65rrors.proto\x12\x06gitaly\x1a\x1egoogle/protobuf/duration.proto\"]\n\x10\x41\x63\x63\x65ssCheckError\x12\x15\n\rerror_message\x18\x01 \x01(\t\x12\x10\n\x08protocol\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x0f\n\x07\x63hanges\x18\x04 \x01(\x0c\"\xae\x02\n\nIndexError\x12\x0c\n\x04path\x18\x01 \x01(\x0c\x12\x30\n\nerror_type\x18\x02 \x01(\x0e\x32\x1c.gitaly.IndexError.ErrorType\"\xdf\x01\n\tErrorType\x12\x1a\n\x16\x45RROR_TYPE_UNSPECIFIED\x10\x00\x12\x19\n\x15\x45RROR_TYPE_EMPTY_PATH\x10\x01\x12\x1b\n\x17\x45RROR_TYPE_INVALID_PATH\x10\x02\x12\x1f\n\x1b\x45RROR_TYPE_DIRECTORY_EXISTS\x10\x03\x12\"\n\x1e\x45RROR_TYPE_DIRECTORY_TRAVERSAL\x10\x04\x12\x1a\n\x16\x45RROR_TYPE_FILE_EXISTS\x10\x05\x12\x1d\n\x19\x45RROR_TYPE_FILE_NOT_FOUND\x10\x06\"%\n\x15InvalidRefFormatError\x12\x0c\n\x04refs\x18\x02 \x03(\x0c\"C\n\x10NotAncestorError\x12\x17\n\x0fparent_revision\x18\x01 \x01(\x0c\x12\x16\n\x0e\x63hild_revision\x18\x02 \x01(\x0c\"\x1c\n\x1a\x43hangesAlreadyAppliedError\"O\n\x12MergeConflictError\x12\x19\n\x11\x63onflicting_files\x18\x01 \x03(\x0c\x12\x1e\n\x16\x63onflicting_commit_ids\x18\x02 \x03(\t\"%\n\x15ReferencesLockedError\x12\x0c\n\x04refs\x18\x01 \x03(\x0c\";\n\x14ReferenceExistsError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\x12\x0b\n\x03oid\x18\x02 \x01(\t\"0\n\x16ReferenceNotFoundError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\"P\n\x14ReferenceUpdateError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\x12\x0f\n\x07old_oid\x18\x02 \x01(\t\x12\x0f\n\x07new_oid\x18\x03 \x01(\t\"(\n\x14ResolveRevisionError\x12\x10\n\x08revision\x18\x01 \x01(\x0c\"S\n\nLimitError\x12\x15\n\rerror_message\x18\x01 \x01(\t\x12.\n\x0bretry_after\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\"\xd8\x01\n\x0f\x43ustomHookError\x12\x0e\n\x06stdout\x18\x01 \x01(\x0c\x12\x0e\n\x06stderr\x18\x02 \x01(\x0c\x12\x33\n\thook_type\x18\x03 \x01(\x0e\x32 .gitaly.CustomHookError.HookType\"p\n\x08HookType\x12\x19\n\x15HOOK_TYPE_UNSPECIFIED\x10\x00\x12\x18\n\x14HOOK_TYPE_PRERECEIVE\x10\x01\x12\x14\n\x10HOOK_TYPE_UPDATE\x10\x02\x12\x19\n\x15HOOK_TYPE_POSTRECEIVE\x10\x03\x42\x34Z2gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypbb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,])
 
 
 
@@ -24,8 +24,58 @@
   ,
   dependencies=[google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,])
 
 
 
+_INDEXERROR_ERRORTYPE = _descriptor.EnumDescriptor(
+  name='ErrorType',
+  full_name='gitaly.IndexError.ErrorType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_EMPTY_PATH', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_INVALID_PATH', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_DIRECTORY_EXISTS', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_DIRECTORY_TRAVERSAL', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_FILE_EXISTS', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR_TYPE_FILE_NOT_FOUND', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=231,
+  serialized_end=454,
+)
+_sym_db.RegisterEnumDescriptor(_INDEXERROR_ERRORTYPE)
+
 _CUSTOMHOOKERROR_HOOKTYPE = _descriptor.EnumDescriptor(
   name='HookType',
   full_name='gitaly.CustomHookError.HookType',
@@ -56,8 +106,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=834,
-  serialized_end=946,
+  serialized_start=1139,
+  serialized_end=1251,
 )
 _sym_db.RegisterEnumDescriptor(_CUSTOMHOOKERROR_HOOKTYPE)
 
@@ -115,6 +165,46 @@
 )
 
 
+_INDEXERROR = _descriptor.Descriptor(
+  name='IndexError',
+  full_name='gitaly.IndexError',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gitaly.IndexError.path', 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,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='error_type', full_name='gitaly.IndexError.error_type', index=1,
+      number=2, 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,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _INDEXERROR_ERRORTYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=152,
+  serialized_end=454,
+)
+
+
 _INVALIDREFFORMATERROR = _descriptor.Descriptor(
   name='InvalidRefFormatError',
   full_name='gitaly.InvalidRefFormatError',
@@ -142,8 +232,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=151,
-  serialized_end=188,
+  serialized_start=456,
+  serialized_end=493,
 )
 
 
@@ -181,8 +271,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=190,
-  serialized_end=257,
+  serialized_start=495,
+  serialized_end=562,
 )
 
 
@@ -206,8 +296,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=259,
-  serialized_end=287,
+  serialized_start=564,
+  serialized_end=592,
 )
 
 
@@ -245,8 +335,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=289,
-  serialized_end=368,
+  serialized_start=594,
+  serialized_end=673,
 )
 
 
@@ -277,8 +367,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=370,
-  serialized_end=407,
+  serialized_start=675,
+  serialized_end=712,
 )
 
 
@@ -316,8 +406,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=409,
-  serialized_end=468,
+  serialized_start=714,
+  serialized_end=773,
 )
 
 
@@ -348,8 +438,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=470,
-  serialized_end=518,
+  serialized_start=775,
+  serialized_end=823,
 )
 
 
@@ -394,8 +484,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=520,
-  serialized_end=600,
+  serialized_start=825,
+  serialized_end=905,
 )
 
 
@@ -426,8 +516,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=602,
-  serialized_end=642,
+  serialized_start=907,
+  serialized_end=947,
 )
 
 
@@ -465,8 +555,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=644,
-  serialized_end=727,
+  serialized_start=949,
+  serialized_end=1032,
 )
 
 
@@ -512,7 +602,7 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=730,
-  serialized_end=946,
+  serialized_start=1035,
+  serialized_end=1251,
 )
 
@@ -517,6 +607,8 @@
 )
 
+_INDEXERROR.fields_by_name['error_type'].enum_type = _INDEXERROR_ERRORTYPE
+_INDEXERROR_ERRORTYPE.containing_type = _INDEXERROR
 _LIMITERROR.fields_by_name['retry_after'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
 _CUSTOMHOOKERROR.fields_by_name['hook_type'].enum_type = _CUSTOMHOOKERROR_HOOKTYPE
 _CUSTOMHOOKERROR_HOOKTYPE.containing_type = _CUSTOMHOOKERROR
 DESCRIPTOR.message_types_by_name['AccessCheckError'] = _ACCESSCHECKERROR
@@ -519,7 +611,8 @@
 _LIMITERROR.fields_by_name['retry_after'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
 _CUSTOMHOOKERROR.fields_by_name['hook_type'].enum_type = _CUSTOMHOOKERROR_HOOKTYPE
 _CUSTOMHOOKERROR_HOOKTYPE.containing_type = _CUSTOMHOOKERROR
 DESCRIPTOR.message_types_by_name['AccessCheckError'] = _ACCESSCHECKERROR
+DESCRIPTOR.message_types_by_name['IndexError'] = _INDEXERROR
 DESCRIPTOR.message_types_by_name['InvalidRefFormatError'] = _INVALIDREFFORMATERROR
 DESCRIPTOR.message_types_by_name['NotAncestorError'] = _NOTANCESTORERROR
 DESCRIPTOR.message_types_by_name['ChangesAlreadyAppliedError'] = _CHANGESALREADYAPPLIEDERROR
@@ -540,6 +633,13 @@
   })
 _sym_db.RegisterMessage(AccessCheckError)
 
+IndexError = _reflection.GeneratedProtocolMessageType('IndexError', (_message.Message,), {
+  'DESCRIPTOR' : _INDEXERROR,
+  '__module__' : 'errors_pb2'
+  # @@protoc_insertion_point(class_scope:gitaly.IndexError)
+  })
+_sym_db.RegisterMessage(IndexError)
+
 InvalidRefFormatError = _reflection.GeneratedProtocolMessageType('InvalidRefFormatError', (_message.Message,), {
   'DESCRIPTOR' : _INVALIDREFFORMATERROR,
   '__module__' : 'errors_pb2'
diff --git a/hgitaly/stub/repository_pb2.py b/hgitaly/stub/repository_pb2.py
index 4afe074f4af566aab0259560e94729ce9e7e8681_aGdpdGFseS9zdHViL3JlcG9zaXRvcnlfcGIyLnB5..2fe1bbabf00a52e71d2b99e3dfad51c7f535eb02_aGdpdGFseS9zdHViL3JlcG9zaXRvcnlfcGIyLnB5 100644
--- a/hgitaly/stub/repository_pb2.py
+++ b/hgitaly/stub/repository_pb2.py
@@ -21,7 +21,7 @@
   syntax='proto3',
   serialized_options=b'Z2gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x10repository.proto\x12\x06gitaly\x1a\nlint.proto\x1a\x0cshared.proto\"G\n\x17RepositoryExistsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"*\n\x18RepositoryExistsResponse\x12\x0e\n\x06\x65xists\x18\x01 \x01(\x08\"H\n\x18RepackIncrementalRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1b\n\x19RepackIncrementalResponse\"X\n\x11RepackFullRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rcreate_bitmap\x18\x02 \x01(\x08\"\x14\n\x12RepackFullResponse\"A\n\x11MidxRepackRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x14\n\x12MidxRepackResponse\"k\n\x15GarbageCollectRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rcreate_bitmap\x18\x02 \x01(\x08\x12\r\n\x05prune\x18\x03 \x01(\x08\"\x18\n\x16GarbageCollectResponse\"\xb0\x01\n\x17WriteCommitGraphRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x44\n\rsplitStrategy\x18\x02 \x01(\x0e\x32-.gitaly.WriteCommitGraphRequest.SplitStrategy\"!\n\rSplitStrategy\x12\x10\n\x0cSizeMultiple\x10\x00\"\x1a\n\x18WriteCommitGraphResponse\">\n\x0e\x43leanupRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x11\n\x0f\x43leanupResponse\"E\n\x15RepositorySizeRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"&\n\x16RepositorySizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"[\n\x19\x41pplyGitattributesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41pplyGitattributesResponse\"e\n\x12\x46\x65tchBundleRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x13\n\x0bupdate_head\x18\x03 \x01(\x08\"\x15\n\x13\x46\x65tchBundleResponse\"\x82\x02\n\x12\x46\x65tchRemoteRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x12\x0f\n\x07no_tags\x18\x04 \x01(\x08\x12\x0f\n\x07timeout\x18\x05 \x01(\x05\x12\x0f\n\x07ssh_key\x18\x06 \x01(\t\x12\x13\n\x0bknown_hosts\x18\x07 \x01(\t\x12\x10\n\x08no_prune\x18\t \x01(\x08\x12%\n\rremote_params\x18\n \x01(\x0b\x32\x0e.gitaly.Remote\x12\x1a\n\x12\x63heck_tags_changed\x18\x0b \x01(\x08J\x04\x08\x08\x10\tJ\x04\x08\x02\x10\x03R\x06remote\"+\n\x13\x46\x65tchRemoteResponse\x12\x14\n\x0ctags_changed\x18\x01 \x01(\x08\"_\n\x17\x43reateRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x16\n\x0e\x64\x65\x66\x61ult_branch\x18\x02 \x01(\x0c\"\x1a\n\x18\x43reateRepositoryResponse\"\x99\x02\n\x11GetArchiveRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\tcommit_id\x18\x02 \x01(\t\x12\x0e\n\x06prefix\x18\x03 \x01(\t\x12\x30\n\x06\x66ormat\x18\x04 \x01(\x0e\x32 .gitaly.GetArchiveRequest.Format\x12\x0c\n\x04path\x18\x05 \x01(\x0c\x12\x0f\n\x07\x65xclude\x18\x06 \x03(\x0c\x12\x12\n\nelide_path\x18\x07 \x01(\x08\x12\x19\n\x11include_lfs_blobs\x18\x08 \x01(\x08\"3\n\x06\x46ormat\x12\x07\n\x03ZIP\x10\x00\x12\x07\n\x03TAR\x10\x01\x12\n\n\x06TAR_GZ\x10\x02\x12\x0b\n\x07TAR_BZ2\x10\x03\"\"\n\x12GetArchiveResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"G\n\x17HasLocalBranchesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\")\n\x18HasLocalBranchesResponse\x12\r\n\x05value\x18\x01 \x01(\x08\"\xa2\x01\n\x18\x46\x65tchSourceBranchRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12-\n\x11source_repository\x18\x02 \x01(\x0b\x32\x12.gitaly.Repository\x12\x15\n\rsource_branch\x18\x03 \x01(\x0c\x12\x12\n\ntarget_ref\x18\x04 \x01(\x0c\"+\n\x19\x46\x65tchSourceBranchResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\";\n\x0b\x46sckRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1d\n\x0c\x46sckResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\x0c\"\x89\x01\n\x0fWriteRefRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0b\n\x03ref\x18\x02 \x01(\x0c\x12\x10\n\x08revision\x18\x03 \x01(\x0c\x12\x14\n\x0cold_revision\x18\x04 \x01(\x0c\x12\r\n\x05\x66orce\x18\x05 \x01(\x08J\x04\x08\x06\x10\x07\"\x18\n\x10WriteRefResponseJ\x04\x08\x01\x10\x02\"W\n\x14\x46indMergeBaseRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\trevisions\x18\x02 \x03(\x0c\"%\n\x15\x46indMergeBaseResponse\x12\x0c\n\x04\x62\x61se\x18\x01 \x01(\t\"p\n\x11\x43reateForkRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12-\n\x11source_repository\x18\x02 \x01(\x0b\x32\x12.gitaly.Repository\"\x14\n\x12\x43reateForkResponse\"\xa1\x01\n\x1e\x43reateRepositoryFromURLRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x11\n\thttp_host\x18\x03 \x01(\t\x12!\n\x19http_authorization_header\x18\x04 \x01(\t\x12\x0e\n\x06mirror\x18\x05 \x01(\x08\"!\n\x1f\x43reateRepositoryFromURLResponse\"C\n\x13\x43reateBundleRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"$\n\x14\x43reateBundleResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"`\n\x1e\x43reateBundleFromRefListRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08patterns\x18\x02 \x03(\x0c\"/\n\x1f\x43reateBundleFromRefListResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"@\n\x10GetConfigRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"!\n\x11GetConfigResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"W\n\x19RestoreCustomHooksRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x1c\n\x1aRestoreCustomHooksResponse\"H\n\x18\x42\x61\x63kupCustomHooksRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\")\n\x19\x42\x61\x63kupCustomHooksResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"_\n!CreateRepositoryFromBundleRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"$\n\"CreateRepositoryFromBundleResponse\"B\n\x12\x46indLicenseRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x8c\x01\n\x13\x46indLicenseResponse\x12\x1a\n\x12license_short_name\x18\x01 \x01(\t\x12\x14\n\x0clicense_name\x18\x02 \x01(\t\x12\x13\n\x0blicense_url\x18\x03 \x01(\t\x12\x14\n\x0clicense_path\x18\x04 \x01(\t\x12\x18\n\x10license_nickname\x18\x05 \x01(\t\"H\n\x18GetInfoAttributesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"/\n\x19GetInfoAttributesResponse\x12\x12\n\nattributes\x18\x01 \x01(\x0c\"H\n\x18\x43\x61lculateChecksumRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"-\n\x19\x43\x61lculateChecksumResponse\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\"B\n\x12GetSnapshotRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"#\n\x13GetSnapshotResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x8b\x01\n#CreateRepositoryFromSnapshotRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08http_url\x18\x02 \x01(\t\x12\x11\n\thttp_auth\x18\x03 \x01(\t\x12\x11\n\thttp_host\x18\x04 \x01(\t\"&\n$CreateRepositoryFromSnapshotResponse\"p\n\x14GetRawChangesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rfrom_revision\x18\x02 \x01(\t\x12\x13\n\x0bto_revision\x18\x03 \x01(\t\"\xbe\x03\n\x15GetRawChangesResponse\x12<\n\x0braw_changes\x18\x01 \x03(\x0b\x32\'.gitaly.GetRawChangesResponse.RawChange\x1a\xe6\x02\n\tRawChange\x12\x0f\n\x07\x62lob_id\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x44\n\toperation\x18\x05 \x01(\x0e\x32\x31.gitaly.GetRawChangesResponse.RawChange.Operation\x12\x15\n\rraw_operation\x18\x06 \x01(\t\x12\x10\n\x08old_mode\x18\x07 \x01(\x05\x12\x10\n\x08new_mode\x18\x08 \x01(\x05\x12\x16\n\x0enew_path_bytes\x18\t \x01(\x0c\x12\x16\n\x0eold_path_bytes\x18\n \x01(\x0c\"i\n\tOperation\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x41\x44\x44\x45\x44\x10\x01\x12\n\n\x06\x43OPIED\x10\x02\x12\x0b\n\x07\x44\x45LETED\x10\x03\x12\x0c\n\x08MODIFIED\x10\x04\x12\x0b\n\x07RENAMED\x10\x05\x12\x10\n\x0cTYPE_CHANGED\x10\x06J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05R\x08new_pathR\x08old_path\"t\n\x18SearchFilesByNameRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\r\n\x05query\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\x0c\x12\x0e\n\x06\x66ilter\x18\x04 \x01(\t\"*\n\x19SearchFilesByNameResponse\x12\r\n\x05\x66iles\x18\x01 \x03(\x0c\"\x81\x01\n\x1bSearchFilesByContentRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\r\n\x05query\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\x0c\x12\x18\n\x10\x63hunked_response\x18\x04 \x01(\x08\"Y\n\x1cSearchFilesByContentResponse\x12\x0f\n\x07matches\x18\x01 \x03(\x0c\x12\x12\n\nmatch_data\x18\x02 \x01(\x0c\x12\x14\n\x0c\x65nd_of_match\x18\x03 \x01(\x08\"o\n\x06Remote\x12\x0b\n\x03url\x18\x01 \x01(\t\x12!\n\x19http_authorization_header\x18\x03 \x01(\t\x12\x16\n\x0emirror_refmaps\x18\x04 \x03(\t\x12\x11\n\thttp_host\x18\x05 \x01(\tJ\x04\x08\x02\x10\x03R\x04name\"M\n\x1dGetObjectDirectorySizeRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\".\n\x1eGetObjectDirectorySizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"G\n\x17RemoveRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1a\n\x18RemoveRepositoryResponse\"^\n\x17RenameRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rrelative_path\x18\x02 \x01(\t\"\x1a\n\x18RenameRepositoryResponse\"n\n\x1aReplicateRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\"\n\x06source\x18\x02 \x01(\x0b\x32\x12.gitaly.Repository\"\x1d\n\x1bReplicateRepositoryResponse\"I\n\x19OptimizeRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1c\n\x1aOptimizeRepositoryResponse\"N\n\x1ePruneUnreachableObjectsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"!\n\x1fPruneUnreachableObjectsResponse\"P\n\x12SetFullPathRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x15\n\x13SetFullPathResponse\"?\n\x0f\x46ullPathRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\" \n\x10\x46ullPathResponse\x12\x0c\n\x04path\x18\x01 \x01(\t2\xe3\x1e\n\x11RepositoryService\x12]\n\x10RepositoryExists\x12\x1f.gitaly.RepositoryExistsRequest\x1a .gitaly.RepositoryExistsResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x63\n\x11RepackIncremental\x12 .gitaly.RepackIncrementalRequest\x1a!.gitaly.RepackIncrementalResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12N\n\nRepackFull\x12\x19.gitaly.RepackFullRequest\x1a\x1a.gitaly.RepackFullResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12N\n\nMidxRepack\x12\x19.gitaly.MidxRepackRequest\x1a\x1a.gitaly.MidxRepackResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12Z\n\x0eGarbageCollect\x12\x1d.gitaly.GarbageCollectRequest\x1a\x1e.gitaly.GarbageCollectResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12`\n\x10WriteCommitGraph\x12\x1f.gitaly.WriteCommitGraphRequest\x1a .gitaly.WriteCommitGraphResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12W\n\x0eRepositorySize\x12\x1d.gitaly.RepositorySizeRequest\x1a\x1e.gitaly.RepositorySizeResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x63\n\x12\x41pplyGitattributes\x12!.gitaly.ApplyGitattributesRequest\x1a\".gitaly.ApplyGitattributesResponse\"\x06\xfa\x97(\x02\x08\x01\x12N\n\x0b\x46\x65tchRemote\x12\x1a.gitaly.FetchRemoteRequest\x1a\x1b.gitaly.FetchRemoteResponse\"\x06\xfa\x97(\x02\x08\x01\x12]\n\x10\x43reateRepository\x12\x1f.gitaly.CreateRepositoryRequest\x1a .gitaly.CreateRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12M\n\nGetArchive\x12\x19.gitaly.GetArchiveRequest\x1a\x1a.gitaly.GetArchiveResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12]\n\x10HasLocalBranches\x12\x1f.gitaly.HasLocalBranchesRequest\x1a .gitaly.HasLocalBranchesResponse\"\x06\xfa\x97(\x02\x08\x02\x12`\n\x11\x46\x65tchSourceBranch\x12 .gitaly.FetchSourceBranchRequest\x1a!.gitaly.FetchSourceBranchResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x39\n\x04\x46sck\x12\x13.gitaly.FsckRequest\x1a\x14.gitaly.FsckResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x45\n\x08WriteRef\x12\x17.gitaly.WriteRefRequest\x1a\x18.gitaly.WriteRefResponse\"\x06\xfa\x97(\x02\x08\x01\x12T\n\rFindMergeBase\x12\x1c.gitaly.FindMergeBaseRequest\x1a\x1d.gitaly.FindMergeBaseResponse\"\x06\xfa\x97(\x02\x08\x02\x12K\n\nCreateFork\x12\x19.gitaly.CreateForkRequest\x1a\x1a.gitaly.CreateForkResponse\"\x06\xfa\x97(\x02\x08\x01\x12r\n\x17\x43reateRepositoryFromURL\x12&.gitaly.CreateRepositoryFromURLRequest\x1a\'.gitaly.CreateRepositoryFromURLResponse\"\x06\xfa\x97(\x02\x08\x01\x12S\n\x0c\x43reateBundle\x12\x1b.gitaly.CreateBundleRequest\x1a\x1c.gitaly.CreateBundleResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12v\n\x17\x43reateBundleFromRefList\x12&.gitaly.CreateBundleFromRefListRequest\x1a\'.gitaly.CreateBundleFromRefListResponse\"\x06\xfa\x97(\x02\x08\x02(\x01\x30\x01\x12P\n\x0b\x46\x65tchBundle\x12\x1a.gitaly.FetchBundleRequest\x1a\x1b.gitaly.FetchBundleResponse\"\x06\xfa\x97(\x02\x08\x01(\x01\x12}\n\x1a\x43reateRepositoryFromBundle\x12).gitaly.CreateRepositoryFromBundleRequest\x1a*.gitaly.CreateRepositoryFromBundleResponse\"\x06\xfa\x97(\x02\x08\x01(\x01\x12J\n\tGetConfig\x12\x18.gitaly.GetConfigRequest\x1a\x19.gitaly.GetConfigResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12N\n\x0b\x46indLicense\x12\x1a.gitaly.FindLicenseRequest\x1a\x1b.gitaly.FindLicenseResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x62\n\x11GetInfoAttributes\x12 .gitaly.GetInfoAttributesRequest\x1a!.gitaly.GetInfoAttributesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12`\n\x11\x43\x61lculateChecksum\x12 .gitaly.CalculateChecksumRequest\x1a!.gitaly.CalculateChecksumResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x45\n\x07\x43leanup\x12\x16.gitaly.CleanupRequest\x1a\x17.gitaly.CleanupResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12P\n\x0bGetSnapshot\x12\x1a.gitaly.GetSnapshotRequest\x1a\x1b.gitaly.GetSnapshotResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x81\x01\n\x1c\x43reateRepositoryFromSnapshot\x12+.gitaly.CreateRepositoryFromSnapshotRequest\x1a,.gitaly.CreateRepositoryFromSnapshotResponse\"\x06\xfa\x97(\x02\x08\x01\x12V\n\rGetRawChanges\x12\x1c.gitaly.GetRawChangesRequest\x1a\x1d.gitaly.GetRawChangesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12k\n\x14SearchFilesByContent\x12#.gitaly.SearchFilesByContentRequest\x1a$.gitaly.SearchFilesByContentResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x62\n\x11SearchFilesByName\x12 .gitaly.SearchFilesByNameRequest\x1a!.gitaly.SearchFilesByNameResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x65\n\x12RestoreCustomHooks\x12!.gitaly.RestoreCustomHooksRequest\x1a\".gitaly.RestoreCustomHooksResponse\"\x06\xfa\x97(\x02\x08\x01(\x01\x12\x62\n\x11\x42\x61\x63kupCustomHooks\x12 .gitaly.BackupCustomHooksRequest\x1a!.gitaly.BackupCustomHooksResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12o\n\x16GetObjectDirectorySize\x12%.gitaly.GetObjectDirectorySizeRequest\x1a&.gitaly.GetObjectDirectorySizeResponse\"\x06\xfa\x97(\x02\x08\x02\x12]\n\x10RemoveRepository\x12\x1f.gitaly.RemoveRepositoryRequest\x1a .gitaly.RemoveRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12]\n\x10RenameRepository\x12\x1f.gitaly.RenameRepositoryRequest\x1a .gitaly.RenameRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x66\n\x13ReplicateRepository\x12\".gitaly.ReplicateRepositoryRequest\x1a#.gitaly.ReplicateRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x63\n\x12OptimizeRepository\x12!.gitaly.OptimizeRepositoryRequest\x1a\".gitaly.OptimizeRepositoryResponse\"\x06\xfa\x97(\x02\x08\x03\x12r\n\x17PruneUnreachableObjects\x12&.gitaly.PruneUnreachableObjectsRequest\x1a\'.gitaly.PruneUnreachableObjectsResponse\"\x06\xfa\x97(\x02\x08\x03\x12N\n\x0bSetFullPath\x12\x1a.gitaly.SetFullPathRequest\x1a\x1b.gitaly.SetFullPathResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x45\n\x08\x46ullPath\x12\x17.gitaly.FullPathRequest\x1a\x18.gitaly.FullPathResponse\"\x06\xfa\x97(\x02\x08\x02\x42\x34Z2gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypbb\x06proto3'
+  serialized_pb=b'\n\x10repository.proto\x12\x06gitaly\x1a\nlint.proto\x1a\x0cshared.proto\"G\n\x17RepositoryExistsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"*\n\x18RepositoryExistsResponse\x12\x0e\n\x06\x65xists\x18\x01 \x01(\x08\"H\n\x18RepackIncrementalRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1b\n\x19RepackIncrementalResponse\"X\n\x11RepackFullRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rcreate_bitmap\x18\x02 \x01(\x08\"\x14\n\x12RepackFullResponse\"A\n\x11MidxRepackRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x14\n\x12MidxRepackResponse\"k\n\x15GarbageCollectRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rcreate_bitmap\x18\x02 \x01(\x08\x12\r\n\x05prune\x18\x03 \x01(\x08\"\x18\n\x16GarbageCollectResponse\"\xb0\x01\n\x17WriteCommitGraphRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x44\n\rsplitStrategy\x18\x02 \x01(\x0e\x32-.gitaly.WriteCommitGraphRequest.SplitStrategy\"!\n\rSplitStrategy\x12\x10\n\x0cSizeMultiple\x10\x00\"\x1a\n\x18WriteCommitGraphResponse\">\n\x0e\x43leanupRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x11\n\x0f\x43leanupResponse\"E\n\x15RepositorySizeRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"&\n\x16RepositorySizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"[\n\x19\x41pplyGitattributesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\x1c\n\x1a\x41pplyGitattributesResponse\"e\n\x12\x46\x65tchBundleRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x13\n\x0bupdate_head\x18\x03 \x01(\x08\"\x15\n\x13\x46\x65tchBundleResponse\"\x82\x02\n\x12\x46\x65tchRemoteRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\x12\x0f\n\x07no_tags\x18\x04 \x01(\x08\x12\x0f\n\x07timeout\x18\x05 \x01(\x05\x12\x0f\n\x07ssh_key\x18\x06 \x01(\t\x12\x13\n\x0bknown_hosts\x18\x07 \x01(\t\x12\x10\n\x08no_prune\x18\t \x01(\x08\x12%\n\rremote_params\x18\n \x01(\x0b\x32\x0e.gitaly.Remote\x12\x1a\n\x12\x63heck_tags_changed\x18\x0b \x01(\x08J\x04\x08\x08\x10\tJ\x04\x08\x02\x10\x03R\x06remote\"+\n\x13\x46\x65tchRemoteResponse\x12\x14\n\x0ctags_changed\x18\x01 \x01(\x08\"_\n\x17\x43reateRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x16\n\x0e\x64\x65\x66\x61ult_branch\x18\x02 \x01(\x0c\"\x1a\n\x18\x43reateRepositoryResponse\"\x99\x02\n\x11GetArchiveRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\tcommit_id\x18\x02 \x01(\t\x12\x0e\n\x06prefix\x18\x03 \x01(\t\x12\x30\n\x06\x66ormat\x18\x04 \x01(\x0e\x32 .gitaly.GetArchiveRequest.Format\x12\x0c\n\x04path\x18\x05 \x01(\x0c\x12\x0f\n\x07\x65xclude\x18\x06 \x03(\x0c\x12\x12\n\nelide_path\x18\x07 \x01(\x08\x12\x19\n\x11include_lfs_blobs\x18\x08 \x01(\x08\"3\n\x06\x46ormat\x12\x07\n\x03ZIP\x10\x00\x12\x07\n\x03TAR\x10\x01\x12\n\n\x06TAR_GZ\x10\x02\x12\x0b\n\x07TAR_BZ2\x10\x03\"\"\n\x12GetArchiveResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"G\n\x17HasLocalBranchesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\")\n\x18HasLocalBranchesResponse\x12\r\n\x05value\x18\x01 \x01(\x08\"\xa2\x01\n\x18\x46\x65tchSourceBranchRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12-\n\x11source_repository\x18\x02 \x01(\x0b\x32\x12.gitaly.Repository\x12\x15\n\rsource_branch\x18\x03 \x01(\x0c\x12\x12\n\ntarget_ref\x18\x04 \x01(\x0c\"+\n\x19\x46\x65tchSourceBranchResponse\x12\x0e\n\x06result\x18\x01 \x01(\x08\";\n\x0b\x46sckRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1d\n\x0c\x46sckResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\x0c\"\x89\x01\n\x0fWriteRefRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0b\n\x03ref\x18\x02 \x01(\x0c\x12\x10\n\x08revision\x18\x03 \x01(\x0c\x12\x14\n\x0cold_revision\x18\x04 \x01(\x0c\x12\r\n\x05\x66orce\x18\x05 \x01(\x08J\x04\x08\x06\x10\x07\"\x18\n\x10WriteRefResponseJ\x04\x08\x01\x10\x02\"W\n\x14\x46indMergeBaseRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\trevisions\x18\x02 \x03(\x0c\"%\n\x15\x46indMergeBaseResponse\x12\x0c\n\x04\x62\x61se\x18\x01 \x01(\t\"p\n\x11\x43reateForkRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12-\n\x11source_repository\x18\x02 \x01(\x0b\x32\x12.gitaly.Repository\"\x14\n\x12\x43reateForkResponse\"\xbf\x01\n\x1e\x43reateRepositoryFromURLRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x15\n\thttp_host\x18\x03 \x01(\tB\x02\x18\x01\x12!\n\x19http_authorization_header\x18\x04 \x01(\t\x12\x0e\n\x06mirror\x18\x05 \x01(\x08\x12\x18\n\x10resolved_address\x18\x06 \x01(\t\"!\n\x1f\x43reateRepositoryFromURLResponse\"C\n\x13\x43reateBundleRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"$\n\x14\x43reateBundleResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"`\n\x1e\x43reateBundleFromRefListRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08patterns\x18\x02 \x03(\x0c\"/\n\x1f\x43reateBundleFromRefListResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"@\n\x10GetConfigRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"!\n\x11GetConfigResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"W\n\x19RestoreCustomHooksRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x1c\n\x1aRestoreCustomHooksResponse\"H\n\x18\x42\x61\x63kupCustomHooksRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\")\n\x19\x42\x61\x63kupCustomHooksResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"_\n!CreateRepositoryFromBundleRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"$\n\"CreateRepositoryFromBundleResponse\"B\n\x12\x46indLicenseRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x8c\x01\n\x13\x46indLicenseResponse\x12\x1a\n\x12license_short_name\x18\x01 \x01(\t\x12\x14\n\x0clicense_name\x18\x02 \x01(\t\x12\x13\n\x0blicense_url\x18\x03 \x01(\t\x12\x14\n\x0clicense_path\x18\x04 \x01(\t\x12\x18\n\x10license_nickname\x18\x05 \x01(\t\"H\n\x18GetInfoAttributesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"/\n\x19GetInfoAttributesResponse\x12\x12\n\nattributes\x18\x01 \x01(\x0c\"H\n\x18\x43\x61lculateChecksumRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"-\n\x19\x43\x61lculateChecksumResponse\x12\x10\n\x08\x63hecksum\x18\x01 \x01(\t\"B\n\x12GetSnapshotRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"#\n\x13GetSnapshotResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xa9\x01\n#CreateRepositoryFromSnapshotRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08http_url\x18\x02 \x01(\t\x12\x11\n\thttp_auth\x18\x03 \x01(\t\x12\x15\n\thttp_host\x18\x04 \x01(\tB\x02\x18\x01\x12\x18\n\x10resolved_address\x18\x05 \x01(\t\"&\n$CreateRepositoryFromSnapshotResponse\"p\n\x14GetRawChangesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rfrom_revision\x18\x02 \x01(\t\x12\x13\n\x0bto_revision\x18\x03 \x01(\t\"\xbe\x03\n\x15GetRawChangesResponse\x12<\n\x0braw_changes\x18\x01 \x03(\x0b\x32\'.gitaly.GetRawChangesResponse.RawChange\x1a\xe6\x02\n\tRawChange\x12\x0f\n\x07\x62lob_id\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12\x44\n\toperation\x18\x05 \x01(\x0e\x32\x31.gitaly.GetRawChangesResponse.RawChange.Operation\x12\x15\n\rraw_operation\x18\x06 \x01(\t\x12\x10\n\x08old_mode\x18\x07 \x01(\x05\x12\x10\n\x08new_mode\x18\x08 \x01(\x05\x12\x16\n\x0enew_path_bytes\x18\t \x01(\x0c\x12\x16\n\x0eold_path_bytes\x18\n \x01(\x0c\"i\n\tOperation\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05\x41\x44\x44\x45\x44\x10\x01\x12\n\n\x06\x43OPIED\x10\x02\x12\x0b\n\x07\x44\x45LETED\x10\x03\x12\x0c\n\x08MODIFIED\x10\x04\x12\x0b\n\x07RENAMED\x10\x05\x12\x10\n\x0cTYPE_CHANGED\x10\x06J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05R\x08new_pathR\x08old_path\"\x93\x01\n\x18SearchFilesByNameRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\r\n\x05query\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\x0c\x12\x0e\n\x06\x66ilter\x18\x04 \x01(\t\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x0e\n\x06offset\x18\x06 \x01(\r\"*\n\x19SearchFilesByNameResponse\x12\r\n\x05\x66iles\x18\x01 \x03(\x0c\"\x81\x01\n\x1bSearchFilesByContentRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\r\n\x05query\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\x0c\x12\x18\n\x10\x63hunked_response\x18\x04 \x01(\x08\"Y\n\x1cSearchFilesByContentResponse\x12\x0f\n\x07matches\x18\x01 \x03(\x0c\x12\x12\n\nmatch_data\x18\x02 \x01(\x0c\x12\x14\n\x0c\x65nd_of_match\x18\x03 \x01(\x08\"\x8d\x01\n\x06Remote\x12\x0b\n\x03url\x18\x01 \x01(\t\x12!\n\x19http_authorization_header\x18\x03 \x01(\t\x12\x16\n\x0emirror_refmaps\x18\x04 \x03(\t\x12\x15\n\thttp_host\x18\x05 \x01(\tB\x02\x18\x01\x12\x18\n\x10resolved_address\x18\x06 \x01(\tJ\x04\x08\x02\x10\x03R\x04name\"M\n\x1dGetObjectDirectorySizeRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\".\n\x1eGetObjectDirectorySizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"G\n\x17RemoveRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1a\n\x18RemoveRepositoryResponse\"^\n\x17RenameRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x15\n\rrelative_path\x18\x02 \x01(\t\"\x1a\n\x18RenameRepositoryResponse\"n\n\x1aReplicateRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\"\n\x06source\x18\x02 \x01(\x0b\x32\x12.gitaly.Repository\"\x1d\n\x1bReplicateRepositoryResponse\"I\n\x19OptimizeRepositoryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"\x1c\n\x1aOptimizeRepositoryResponse\"N\n\x1ePruneUnreachableObjectsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\"!\n\x1fPruneUnreachableObjectsResponse\"P\n\x12SetFullPathRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04path\x18\x02 \x01(\t\"\x15\n\x13SetFullPathResponse\"?\n\x0f\x46ullPathRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\" \n\x10\x46ullPathResponse\x12\x0c\n\x04path\x18\x01 \x01(\t2\xe3\x1e\n\x11RepositoryService\x12]\n\x10RepositoryExists\x12\x1f.gitaly.RepositoryExistsRequest\x1a .gitaly.RepositoryExistsResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x63\n\x11RepackIncremental\x12 .gitaly.RepackIncrementalRequest\x1a!.gitaly.RepackIncrementalResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12N\n\nRepackFull\x12\x19.gitaly.RepackFullRequest\x1a\x1a.gitaly.RepackFullResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12N\n\nMidxRepack\x12\x19.gitaly.MidxRepackRequest\x1a\x1a.gitaly.MidxRepackResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12Z\n\x0eGarbageCollect\x12\x1d.gitaly.GarbageCollectRequest\x1a\x1e.gitaly.GarbageCollectResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12`\n\x10WriteCommitGraph\x12\x1f.gitaly.WriteCommitGraphRequest\x1a .gitaly.WriteCommitGraphResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12W\n\x0eRepositorySize\x12\x1d.gitaly.RepositorySizeRequest\x1a\x1e.gitaly.RepositorySizeResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x63\n\x12\x41pplyGitattributes\x12!.gitaly.ApplyGitattributesRequest\x1a\".gitaly.ApplyGitattributesResponse\"\x06\xfa\x97(\x02\x08\x01\x12N\n\x0b\x46\x65tchRemote\x12\x1a.gitaly.FetchRemoteRequest\x1a\x1b.gitaly.FetchRemoteResponse\"\x06\xfa\x97(\x02\x08\x01\x12]\n\x10\x43reateRepository\x12\x1f.gitaly.CreateRepositoryRequest\x1a .gitaly.CreateRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12M\n\nGetArchive\x12\x19.gitaly.GetArchiveRequest\x1a\x1a.gitaly.GetArchiveResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12]\n\x10HasLocalBranches\x12\x1f.gitaly.HasLocalBranchesRequest\x1a .gitaly.HasLocalBranchesResponse\"\x06\xfa\x97(\x02\x08\x02\x12`\n\x11\x46\x65tchSourceBranch\x12 .gitaly.FetchSourceBranchRequest\x1a!.gitaly.FetchSourceBranchResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x39\n\x04\x46sck\x12\x13.gitaly.FsckRequest\x1a\x14.gitaly.FsckResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x45\n\x08WriteRef\x12\x17.gitaly.WriteRefRequest\x1a\x18.gitaly.WriteRefResponse\"\x06\xfa\x97(\x02\x08\x01\x12T\n\rFindMergeBase\x12\x1c.gitaly.FindMergeBaseRequest\x1a\x1d.gitaly.FindMergeBaseResponse\"\x06\xfa\x97(\x02\x08\x02\x12K\n\nCreateFork\x12\x19.gitaly.CreateForkRequest\x1a\x1a.gitaly.CreateForkResponse\"\x06\xfa\x97(\x02\x08\x01\x12r\n\x17\x43reateRepositoryFromURL\x12&.gitaly.CreateRepositoryFromURLRequest\x1a\'.gitaly.CreateRepositoryFromURLResponse\"\x06\xfa\x97(\x02\x08\x01\x12S\n\x0c\x43reateBundle\x12\x1b.gitaly.CreateBundleRequest\x1a\x1c.gitaly.CreateBundleResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12v\n\x17\x43reateBundleFromRefList\x12&.gitaly.CreateBundleFromRefListRequest\x1a\'.gitaly.CreateBundleFromRefListResponse\"\x06\xfa\x97(\x02\x08\x02(\x01\x30\x01\x12P\n\x0b\x46\x65tchBundle\x12\x1a.gitaly.FetchBundleRequest\x1a\x1b.gitaly.FetchBundleResponse\"\x06\xfa\x97(\x02\x08\x01(\x01\x12}\n\x1a\x43reateRepositoryFromBundle\x12).gitaly.CreateRepositoryFromBundleRequest\x1a*.gitaly.CreateRepositoryFromBundleResponse\"\x06\xfa\x97(\x02\x08\x01(\x01\x12J\n\tGetConfig\x12\x18.gitaly.GetConfigRequest\x1a\x19.gitaly.GetConfigResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12N\n\x0b\x46indLicense\x12\x1a.gitaly.FindLicenseRequest\x1a\x1b.gitaly.FindLicenseResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x62\n\x11GetInfoAttributes\x12 .gitaly.GetInfoAttributesRequest\x1a!.gitaly.GetInfoAttributesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12`\n\x11\x43\x61lculateChecksum\x12 .gitaly.CalculateChecksumRequest\x1a!.gitaly.CalculateChecksumResponse\"\x06\xfa\x97(\x02\x08\x02\x12\x45\n\x07\x43leanup\x12\x16.gitaly.CleanupRequest\x1a\x17.gitaly.CleanupResponse\"\t\x88\x02\x01\xfa\x97(\x02\x08\x03\x12P\n\x0bGetSnapshot\x12\x1a.gitaly.GetSnapshotRequest\x1a\x1b.gitaly.GetSnapshotResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x81\x01\n\x1c\x43reateRepositoryFromSnapshot\x12+.gitaly.CreateRepositoryFromSnapshotRequest\x1a,.gitaly.CreateRepositoryFromSnapshotResponse\"\x06\xfa\x97(\x02\x08\x01\x12V\n\rGetRawChanges\x12\x1c.gitaly.GetRawChangesRequest\x1a\x1d.gitaly.GetRawChangesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12k\n\x14SearchFilesByContent\x12#.gitaly.SearchFilesByContentRequest\x1a$.gitaly.SearchFilesByContentResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x62\n\x11SearchFilesByName\x12 .gitaly.SearchFilesByNameRequest\x1a!.gitaly.SearchFilesByNameResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x65\n\x12RestoreCustomHooks\x12!.gitaly.RestoreCustomHooksRequest\x1a\".gitaly.RestoreCustomHooksResponse\"\x06\xfa\x97(\x02\x08\x01(\x01\x12\x62\n\x11\x42\x61\x63kupCustomHooks\x12 .gitaly.BackupCustomHooksRequest\x1a!.gitaly.BackupCustomHooksResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12o\n\x16GetObjectDirectorySize\x12%.gitaly.GetObjectDirectorySizeRequest\x1a&.gitaly.GetObjectDirectorySizeResponse\"\x06\xfa\x97(\x02\x08\x02\x12]\n\x10RemoveRepository\x12\x1f.gitaly.RemoveRepositoryRequest\x1a .gitaly.RemoveRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12]\n\x10RenameRepository\x12\x1f.gitaly.RenameRepositoryRequest\x1a .gitaly.RenameRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x66\n\x13ReplicateRepository\x12\".gitaly.ReplicateRepositoryRequest\x1a#.gitaly.ReplicateRepositoryResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x63\n\x12OptimizeRepository\x12!.gitaly.OptimizeRepositoryRequest\x1a\".gitaly.OptimizeRepositoryResponse\"\x06\xfa\x97(\x02\x08\x03\x12r\n\x17PruneUnreachableObjects\x12&.gitaly.PruneUnreachableObjectsRequest\x1a\'.gitaly.PruneUnreachableObjectsResponse\"\x06\xfa\x97(\x02\x08\x03\x12N\n\x0bSetFullPath\x12\x1a.gitaly.SetFullPathRequest\x1a\x1b.gitaly.SetFullPathResponse\"\x06\xfa\x97(\x02\x08\x01\x12\x45\n\x08\x46ullPath\x12\x17.gitaly.FullPathRequest\x1a\x18.gitaly.FullPathResponse\"\x06\xfa\x97(\x02\x08\x02\x42\x34Z2gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypbb\x06proto3'
   ,
   dependencies=[lint__pb2.DESCRIPTOR,shared__pb2.DESCRIPTOR,])
 
@@ -127,8 +127,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=4950,
-  serialized_end=5055,
+  serialized_start=5010,
+  serialized_end=5115,
 )
 _sym_db.RegisterEnumDescriptor(_GETRAWCHANGESRESPONSE_RAWCHANGE_OPERATION)
 
@@ -1526,7 +1526,7 @@
       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,  create_key=_descriptor._internal_create_key),
+      serialized_options=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='http_authorization_header', full_name='gitaly.CreateRepositoryFromURLRequest.http_authorization_header', index=3,
       number=4, type=9, cpp_type=9, label=1,
@@ -1541,6 +1541,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resolved_address', full_name='gitaly.CreateRepositoryFromURLRequest.resolved_address', 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,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -1554,7 +1561,7 @@
   oneofs=[
   ],
   serialized_start=2860,
-  serialized_end=3021,
+  serialized_end=3051,
 )
 
 
@@ -1578,8 +1585,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3023,
-  serialized_end=3056,
+  serialized_start=3053,
+  serialized_end=3086,
 )
 
 
@@ -1610,8 +1617,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3058,
-  serialized_end=3125,
+  serialized_start=3088,
+  serialized_end=3155,
 )
 
 
@@ -1642,8 +1649,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3127,
-  serialized_end=3163,
+  serialized_start=3157,
+  serialized_end=3193,
 )
 
 
@@ -1681,8 +1688,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3165,
-  serialized_end=3261,
+  serialized_start=3195,
+  serialized_end=3291,
 )
 
 
@@ -1713,8 +1720,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3263,
-  serialized_end=3310,
+  serialized_start=3293,
+  serialized_end=3340,
 )
 
 
@@ -1745,8 +1752,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3312,
-  serialized_end=3376,
+  serialized_start=3342,
+  serialized_end=3406,
 )
 
 
@@ -1777,8 +1784,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3378,
-  serialized_end=3411,
+  serialized_start=3408,
+  serialized_end=3441,
 )
 
 
@@ -1816,8 +1823,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3413,
-  serialized_end=3500,
+  serialized_start=3443,
+  serialized_end=3530,
 )
 
 
@@ -1841,8 +1848,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3502,
-  serialized_end=3530,
+  serialized_start=3532,
+  serialized_end=3560,
 )
 
 
@@ -1873,8 +1880,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3532,
-  serialized_end=3604,
+  serialized_start=3562,
+  serialized_end=3634,
 )
 
 
@@ -1905,8 +1912,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3606,
-  serialized_end=3647,
+  serialized_start=3636,
+  serialized_end=3677,
 )
 
 
@@ -1944,8 +1951,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3649,
-  serialized_end=3744,
+  serialized_start=3679,
+  serialized_end=3774,
 )
 
 
@@ -1969,8 +1976,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3746,
-  serialized_end=3782,
+  serialized_start=3776,
+  serialized_end=3812,
 )
 
 
@@ -2001,8 +2008,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3784,
-  serialized_end=3850,
+  serialized_start=3814,
+  serialized_end=3880,
 )
 
 
@@ -2061,8 +2068,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3853,
-  serialized_end=3993,
+  serialized_start=3883,
+  serialized_end=4023,
 )
 
 
@@ -2093,8 +2100,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3995,
-  serialized_end=4067,
+  serialized_start=4025,
+  serialized_end=4097,
 )
 
 
@@ -2125,8 +2132,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4069,
-  serialized_end=4116,
+  serialized_start=4099,
+  serialized_end=4146,
 )
 
 
@@ -2157,8 +2164,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4118,
-  serialized_end=4190,
+  serialized_start=4148,
+  serialized_end=4220,
 )
 
 
@@ -2189,8 +2196,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4192,
-  serialized_end=4237,
+  serialized_start=4222,
+  serialized_end=4267,
 )
 
 
@@ -2221,8 +2228,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4239,
-  serialized_end=4305,
+  serialized_start=4269,
+  serialized_end=4335,
 )
 
 
@@ -2253,8 +2260,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4307,
-  serialized_end=4342,
+  serialized_start=4337,
+  serialized_end=4372,
 )
 
 
@@ -2293,6 +2300,13 @@
       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=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resolved_address', full_name='gitaly.CreateRepositoryFromSnapshotRequest.resolved_address', index=4,
+      number=5, 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,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
@@ -2306,8 +2320,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4345,
-  serialized_end=4484,
+  serialized_start=4375,
+  serialized_end=4544,
 )
 
 
@@ -2331,8 +2345,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4486,
-  serialized_end=4524,
+  serialized_start=4546,
+  serialized_end=4584,
 )
 
 
@@ -2377,8 +2391,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4526,
-  serialized_end=4638,
+  serialized_start=4586,
+  serialized_end=4698,
 )
 
 
@@ -2459,8 +2473,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4729,
-  serialized_end=5087,
+  serialized_start=4789,
+  serialized_end=5147,
 )
 
 _GETRAWCHANGESRESPONSE = _descriptor.Descriptor(
@@ -2490,8 +2504,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4641,
-  serialized_end=5087,
+  serialized_start=4701,
+  serialized_end=5147,
 )
 
 
@@ -2531,6 +2545,20 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='gitaly.SearchFilesByNameRequest.limit', index=4,
+      number=5, type=13, cpp_type=3, 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,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='gitaly.SearchFilesByNameRequest.offset', index=5,
+      number=6, type=13, cpp_type=3, 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,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -2543,8 +2571,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5089,
-  serialized_end=5205,
+  serialized_start=5150,
+  serialized_end=5297,
 )
 
 
@@ -2575,8 +2603,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5207,
-  serialized_end=5249,
+  serialized_start=5299,
+  serialized_end=5341,
 )
 
 
@@ -2628,8 +2656,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5252,
-  serialized_end=5381,
+  serialized_start=5344,
+  serialized_end=5473,
 )
 
 
@@ -2674,8 +2702,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5383,
-  serialized_end=5472,
+  serialized_start=5475,
+  serialized_end=5564,
 )
 
 
@@ -2714,6 +2742,13 @@
       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=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resolved_address', full_name='gitaly.Remote.resolved_address', 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,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
@@ -2727,8 +2762,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5474,
-  serialized_end=5585,
+  serialized_start=5567,
+  serialized_end=5708,
 )
 
 
@@ -2759,8 +2794,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5587,
-  serialized_end=5664,
+  serialized_start=5710,
+  serialized_end=5787,
 )
 
 
@@ -2791,8 +2826,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5666,
-  serialized_end=5712,
+  serialized_start=5789,
+  serialized_end=5835,
 )
 
 
@@ -2823,8 +2858,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5714,
-  serialized_end=5785,
+  serialized_start=5837,
+  serialized_end=5908,
 )
 
 
@@ -2848,8 +2883,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5787,
-  serialized_end=5813,
+  serialized_start=5910,
+  serialized_end=5936,
 )
 
 
@@ -2887,8 +2922,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5815,
-  serialized_end=5909,
+  serialized_start=5938,
+  serialized_end=6032,
 )
 
 
@@ -2912,8 +2947,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5911,
-  serialized_end=5937,
+  serialized_start=6034,
+  serialized_end=6060,
 )
 
 
@@ -2951,8 +2986,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5939,
-  serialized_end=6049,
+  serialized_start=6062,
+  serialized_end=6172,
 )
 
 
@@ -2976,8 +3011,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6051,
-  serialized_end=6080,
+  serialized_start=6174,
+  serialized_end=6203,
 )
 
 
@@ -3008,8 +3043,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6082,
-  serialized_end=6155,
+  serialized_start=6205,
+  serialized_end=6278,
 )
 
 
@@ -3033,8 +3068,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6157,
-  serialized_end=6185,
+  serialized_start=6280,
+  serialized_end=6308,
 )
 
 
@@ -3065,8 +3100,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6187,
-  serialized_end=6265,
+  serialized_start=6310,
+  serialized_end=6388,
 )
 
 
@@ -3090,8 +3125,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6267,
-  serialized_end=6300,
+  serialized_start=6390,
+  serialized_end=6423,
 )
 
 
@@ -3129,8 +3164,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6302,
-  serialized_end=6382,
+  serialized_start=6425,
+  serialized_end=6505,
 )
 
 
@@ -3154,8 +3189,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6384,
-  serialized_end=6405,
+  serialized_start=6507,
+  serialized_end=6528,
 )
 
 
@@ -3186,8 +3221,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6407,
-  serialized_end=6470,
+  serialized_start=6530,
+  serialized_end=6593,
 )
 
 
@@ -3218,8 +3253,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6472,
-  serialized_end=6504,
+  serialized_start=6595,
+  serialized_end=6627,
 )
 
 _REPOSITORYEXISTSREQUEST.fields_by_name['repository'].message_type = shared__pb2._REPOSITORY
@@ -3988,6 +4023,7 @@
 _FINDMERGEBASEREQUEST.fields_by_name['repository']._options = None
 _CREATEFORKREQUEST.fields_by_name['repository']._options = None
 _CREATEREPOSITORYFROMURLREQUEST.fields_by_name['repository']._options = None
+_CREATEREPOSITORYFROMURLREQUEST.fields_by_name['http_host']._options = None
 _CREATEBUNDLEREQUEST.fields_by_name['repository']._options = None
 _CREATEBUNDLEFROMREFLISTREQUEST.fields_by_name['repository']._options = None
 _GETCONFIGREQUEST.fields_by_name['repository']._options = None
@@ -3999,6 +4035,7 @@
 _CALCULATECHECKSUMREQUEST.fields_by_name['repository']._options = None
 _GETSNAPSHOTREQUEST.fields_by_name['repository']._options = None
 _CREATEREPOSITORYFROMSNAPSHOTREQUEST.fields_by_name['repository']._options = None
+_CREATEREPOSITORYFROMSNAPSHOTREQUEST.fields_by_name['http_host']._options = None
 _GETRAWCHANGESREQUEST.fields_by_name['repository']._options = None
 _SEARCHFILESBYNAMEREQUEST.fields_by_name['repository']._options = None
 _SEARCHFILESBYCONTENTREQUEST.fields_by_name['repository']._options = None
@@ -4002,6 +4039,7 @@
 _GETRAWCHANGESREQUEST.fields_by_name['repository']._options = None
 _SEARCHFILESBYNAMEREQUEST.fields_by_name['repository']._options = None
 _SEARCHFILESBYCONTENTREQUEST.fields_by_name['repository']._options = None
+_REMOTE.fields_by_name['http_host']._options = None
 _GETOBJECTDIRECTORYSIZEREQUEST.fields_by_name['repository']._options = None
 _REMOVEREPOSITORYREQUEST.fields_by_name['repository']._options = None
 _RENAMEREPOSITORYREQUEST.fields_by_name['repository']._options = None
@@ -4018,8 +4056,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=6507,
-  serialized_end=10446,
+  serialized_start=6630,
+  serialized_end=10569,
   methods=[
   _descriptor.MethodDescriptor(
     name='RepositoryExists',
diff --git a/protos/errors.proto b/protos/errors.proto
index 4afe074f4af566aab0259560e94729ce9e7e8681_cHJvdG9zL2Vycm9ycy5wcm90bw==..2fe1bbabf00a52e71d2b99e3dfad51c7f535eb02_cHJvdG9zL2Vycm9ycy5wcm90bw== 100644
--- a/protos/errors.proto
+++ b/protos/errors.proto
@@ -19,6 +19,35 @@
   bytes changes = 4;
 }
 
+// IndexError is an error returned when an operation fails to due a conflict with
+// the repository index.
+message IndexError {
+  // ErrorType is the type of error encountered on the index operation.
+  enum ErrorType {
+    // ERROR_TYPE_UNSPECIFIED is the default error type and should never be set.
+    ERROR_TYPE_UNSPECIFIED = 0;
+    // ERROR_TYPE_EMPTY_PATH indicates an empty path was provided by the caller.
+    ERROR_TYPE_EMPTY_PATH = 1;
+    // ERROR_TYPE_INVALID_PATH indicates a path either contained '.git', or was
+    // incorrectly formated, e.g. invalid://file/path.
+    ERROR_TYPE_INVALID_PATH = 2;
+    // ERROR_TYPE_DIRECTORY_EXISTS indicates the directory being created already exists.
+    ERROR_TYPE_DIRECTORY_EXISTS = 3;
+    // ERROR_TYPE_DIRECTORY_TRAVERSAL indicates the path contains a directory traversal
+    // sequence.
+    ERROR_TYPE_DIRECTORY_TRAVERSAL = 4;
+    // ERROR_TYPE_FILE_EXISTS indicates the file being created already exists.
+    ERROR_TYPE_FILE_EXISTS = 5;
+    // ERROR_TYPE_FILE_NOT_FOUND indicates the file being updated does not exist.
+    ERROR_TYPE_FILE_NOT_FOUND = 6;
+  };
+
+  // Path is the file or directory path that triggered the error.
+  bytes path = 1;
+  // ErrorType is the type of index error that occurred.
+  ErrorType error_type = 2;
+}
+
 // InvalidRefFormatError is an error returned when refs have an invalid format.
 message InvalidRefFormatError {
   // Refs are the offending refs with invalid formats.
diff --git a/protos/operations.proto b/protos/operations.proto
index 4afe074f4af566aab0259560e94729ce9e7e8681_cHJvdG9zL29wZXJhdGlvbnMucHJvdG8=..2fe1bbabf00a52e71d2b99e3dfad51c7f535eb02_cHJvdG9zL29wZXJhdGlvbnMucHJvdG8= 100644
--- a/protos/operations.proto
+++ b/protos/operations.proto
@@ -181,9 +181,9 @@
 message UserCreateBranchResponse {
   // This comment is left unintentionally blank.
   Branch branch = 1;
-  // Error returned by the pre-receive hook. If no error was thrown,
-  // it's the empty string ("")
-  string pre_receive_error = 2;
+  // pre_receive_error is deprecated and never set by Gitaly. Instead, Gitaly returns a structured
+  // error with the `custom_hook` field set. This field will be removed in v16.0.
+  string pre_receive_error = 2 [deprecated=true];
 }
 
 // UserCreateBranchError is an error returned by the UserCreateBranch RPC in some specific well
@@ -233,7 +233,7 @@
 // UserDeleteBranchResponse is a response for the UserDeleteBranch RPC.
 message UserDeleteBranchResponse {
   // PreReceiveError is never set anymore. This RPC will instead return a UserDeleteBranchError for
-  // a subset of well-defined error cases.
+  // a subset of well-defined error cases. This field will be removed in v16.0.
   string pre_receive_error = 1 [deprecated=true];
 }
 
@@ -294,11 +294,13 @@
 message UserCreateTagResponse {
   // tag is the newly created tag.
   Tag tag = 1;
-  // exists denotes whether the tag has existed already.
-  bool exists = 2;
-  // pre_receive_error contains an error message if updating the tag failed
-  // because of a pre-receive error.
-  string pre_receive_error = 3;
+  // exists is deprecated and never set by Gitaly. Instead, Gitaly returns a structured error with
+  // the `reference_exists` field set. This field will be removed in v16.0.
+  bool exists = 2 [deprecated=true];
+  // pre_receive_error is deprecated and never set by Gitaly. Instead, Gitaly returns a structured
+  // error with either of the `access_check`, `reference_update` or `custom_hook` fields being set
+  // depending on the error condition. This field will be removed in v16.0.
+  string pre_receive_error = 3 [deprecated=true];
 }
 
 // UserCreateTagError includes error descriptions which may be set as error details in case
@@ -502,17 +504,19 @@
 
   // branch_update represents details about the updated branch.
   OperationBranchUpdate branch_update = 1;
-  // create_tree_error contains the error message if creation of the tree
-  // failed.
-  string create_tree_error = 2;
-  // commit_error contains the error message if updating the reference failed.
-  string commit_error = 3;
-  // pre_receive_error contains the error message if the pre-receive hook
-  // failed.
-  string pre_receive_error = 4;
-  // create_tree_error_code contains the error code if creation of the tree
-  // failed.
-  CreateTreeError create_tree_error_code = 5;
+  // create_tree_error is deprecated and never set by Gitaly. Instead, Gitaly returns a structured
+  // error with the `cherry_pick_conflict` or `changes_already_applied` field set. This field will
+  // be removed in v16.0.
+  string create_tree_error = 2 [deprecated=true];
+  // commit_error is deprecated and never set by Gitaly. Instead, Gitaly returns a structured
+  // error with the `target_branch_diverged` field set. This field will be removed in v16.0.
+  string commit_error = 3 [deprecated=true];
+  // pre_receive_error is deprecated and never set by Gitaly. Instead, Gitaly returns a structured
+  // error with the `access_check` field set. This field will be removed in v16.0.
+  string pre_receive_error = 4 [deprecated=true];
+  // create_tree_error_code is deprecated and never set by Gitaly. There is no replacement. This
+  // field will be removed in v16.0.
+  CreateTreeError create_tree_error_code = 5 [deprecated=true];
 }
 
 // UserCherryPickError is an error returned by the UserCherryPick RPC.
@@ -707,6 +711,21 @@
   string pre_receive_error = 3;
 }
 
+// UserCommitFilesError is an error returned by the UserCommitFiles RPC in some specific well
+// defined error cases.
+message UserCommitFilesError {
+  oneof error {
+    // AccessCheckError is set if the RPC failed because `/internal/allowed` failed.
+    AccessCheckError access_check = 1;
+    // IndexError is set to the error message when an operation conflicts with the repository
+    // index, such as creating a file that already exists.
+    IndexError index_update = 2;
+    // CustomHook is set if any custom hook which has running as part of this RPC call has returned
+    // a non-zero exit code.
+    CustomHookError custom_hook = 3;
+  }
+}
+
 // This comment is left unintentionally blank.
 message UserRebaseConfirmableRequest {
   // Header contains information to compute the rebase and must be sent as
diff --git a/protos/remote.proto b/protos/remote.proto
index 4afe074f4af566aab0259560e94729ce9e7e8681_cHJvdG9zL3JlbW90ZS5wcm90bw==..2fe1bbabf00a52e71d2b99e3dfad51c7f535eb02_cHJvdG9zL3JlbW90ZS5wcm90bw== 100644
--- a/protos/remote.proto
+++ b/protos/remote.proto
@@ -53,8 +53,16 @@
     string http_authorization_header = 2;
     // HttpHost is the hostname of the remote repository. Use this when the
     // URL hostname has already been resolved to an IP address to prevent DNS
-    // rebinding.
-    string http_host = 3;
+    // rebinding. This is deprecated as we will be using resolved_address
+    // going forward.
+    string http_host = 3 [deprecated=true];
+    // ResolvedAddress holds the resolved IP address of the remote_url. This is
+    // used to avoid DNS rebinding by mapping the url to the resolved address.
+    // Only IPv4 dotted decimal ("192.0.2.1"), IPv6 ("2001:db8::68"), or IPv4-mapped
+    // IPv6 ("::ffff:192.0.2.1") forms are supported.
+    // Works with HTTP/HTTPS/Git/SSH protocols.
+    // Optional.
+    string resolved_address = 4;
   }
 
   // Repository is the repository whose mirror repository to update.
@@ -121,8 +129,16 @@
   string http_authorization_header = 4;
   // HttpHost is the hostname of the remote repository. Use this when the
   // URL hostname has already been resolved to an IP address to prevent DNS
-  // rebinding.
-  string http_host = 5;
+  // rebinding. This is deprecated as we will be using resolved_address
+  // going forward.
+  string http_host = 5 [deprecated=true];
+  // ResolvedAddress holds the resolved IP address of the remote_url. This is
+  // used to avoid DNS rebinding by mapping the url to the resolved address.
+  // Only IPv4 dotted decimal ("192.0.2.1"), IPv6 ("2001:db8::68"), or IPv4-mapped
+  // IPv6 ("::ffff:192.0.2.1") forms are supported.
+  // Works with HTTP/HTTPS/Git/SSH protocols.
+  // Optional.
+  string resolved_address = 6;
 
   reserved 2;
   reserved "remote";
diff --git a/protos/repository.proto b/protos/repository.proto
index 4afe074f4af566aab0259560e94729ce9e7e8681_cHJvdG9zL3JlcG9zaXRvcnkucHJvdG8=..2fe1bbabf00a52e71d2b99e3dfad51c7f535eb02_cHJvdG9zL3JlcG9zaXRvcnkucHJvdG8= 100644
--- a/protos/repository.proto
+++ b/protos/repository.proto
@@ -672,8 +672,9 @@
   string url = 2;
   // HttpHost is the hostname of the remote repository. Use this when the
   // URL hostname has already been resolved to an IP address to prevent DNS
-  // rebinding.
-  string http_host = 3;
+  // rebinding. This is deprecated as we will be using resolved_address
+  // going forward.
+  string http_host = 3 [deprecated=true];
   // http_authorization_header is the HTTP header which can be added to
   // the request in order to authenticate against the repository.
   string http_authorization_header = 4;
@@ -683,6 +684,13 @@
   // repository. If set to `true`, create a complete mirror-clone which maps all
   // remote references into the local repository.
   bool mirror = 5;
+  // ResolvedAddress holds the resolved IP address of the remote_url. This is
+  // used to avoid DNS rebinding by mapping the url to the resolved address.
+  // Only IPv4 dotted decimal ("192.0.2.1"), IPv6 ("2001:db8::68"), or IPv4-mapped
+  // IPv6 ("::ffff:192.0.2.1") forms are supported.
+  // Works with HTTP/HTTPS/Git/SSH protocols.
+  // Optional.
+  string resolved_address = 6;
 }
 
 // This comment is left unintentionally blank.
@@ -838,8 +846,16 @@
   string http_auth = 3;
   // HttpHost is the hostname of the remote snapshot. Use this when the
   // URL hostname has already been resolved to an IP address to prevent DNS
-  // rebinding.
-  string http_host = 4;
+  // rebinding. This is deprecated as we will be using resolved_address
+  // going forward.
+  string http_host = 4 [deprecated=true];
+  // ResolvedAddress holds the resolved IP address of the remote_url. This is
+  // used to avoid DNS rebinding by mapping the url to the resolved address.
+  // Only IPv4 dotted decimal ("192.0.2.1"), IPv6 ("2001:db8::68"), or IPv4-mapped
+  // IPv6 ("::ffff:192.0.2.1") forms are supported.
+  // Works with HTTP/HTTPS protocols.
+  // Optional.
+  string resolved_address = 5;
 }
 
 // This comment is left unintentionally blank.
@@ -923,6 +939,12 @@
   // excluding backreferences, atomic/possesive operators, and some other
   // features. It has a maximum length of 1000 bytes.
   string filter = 4;
+  // Limit the number of returned files. Gitaly does not enforce a limit by default.
+  // Clients should always set a value for this field. limit = 0 means unlimited files.
+  uint32 limit = 5;
+  // `offset` says to skip that many files before beginning to return files.
+  // offset = 0 means starting to return files from beginning.
+  uint32 offset = 6;
 }
 
 // This comment is left unintentionally blank.
@@ -974,8 +996,15 @@
   repeated string mirror_refmaps = 4;
   // HttpHost is the hostname of the remote repository. Use this when the
   // URL hostname has already been resolved to an IP address to prevent DNS
-  // rebinding.
-  string http_host = 5;
+  // rebinding. This is deprecated as this field is/was never used.
+  string http_host = 5 [deprecated=true];
+  // ResolvedAddress holds the resolved IP address of the remote_url. This is
+  // used to avoid DNS rebinding by mapping the url to the resolved address.
+  // Only IPv4 dotted decimal ("192.0.2.1"), IPv6 ("2001:db8::68"), or IPv4-mapped
+  // IPv6 ("::ffff:192.0.2.1") forms are supported.
+  // Works with HTTP/HTTPS/Git/SSH protocols.
+  // Optional.
+  string resolved_address = 6;
 
   // Previously, it was possible to specify a remote name. This was quite a
   // dangerous field to set though: the name was simply used to create an ad-hoc