diff --git a/hgitaly/stub/commit_pb2.py b/hgitaly/stub/commit_pb2.py
index 9333633b4fb4fc6e84cb0ee30b22fed537d15879_aGdpdGFseS9zdHViL2NvbW1pdF9wYjIucHk=..78b94b19c00e4008ddb634b01f96a97fb5d1cc6d_aGdpdGFseS9zdHViL2NvbW1pdF9wYjIucHk= 100644
--- a/hgitaly/stub/commit_pb2.py
+++ b/hgitaly/stub/commit_pb2.py
@@ -17,7 +17,7 @@
 from . import shared_pb2 as shared__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x63ommit.proto\x12\x06gitaly\x1a\x0c\x65rrors.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\nlint.proto\x1a\x0cshared.proto\"\xd4\x03\n\x12ListCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\trevisions\x18\x02 \x03(\t\x12\x36\n\x11pagination_params\x18\x03 \x01(\x0b\x32\x1b.gitaly.PaginationParameter\x12/\n\x05order\x18\x04 \x01(\x0e\x32 .gitaly.ListCommitsRequest.Order\x12\x0f\n\x07reverse\x18\x0b \x01(\x08\x12\x13\n\x0bmax_parents\x18\x05 \x01(\r\x12\x14\n\x0c\x64isable_walk\x18\x06 \x01(\x08\x12\x14\n\x0c\x66irst_parent\x18\x07 \x01(\x08\x12)\n\x05\x61\x66ter\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x06\x62\x65\x66ore\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x61uthor\x18\n \x01(\x0c\x12\x13\n\x0bignore_case\x18\x0c \x01(\x08\x12\x1f\n\x17\x63ommit_message_patterns\x18\r \x03(\x0c\"%\n\x05Order\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04TOPO\x10\x01\x12\x08\n\x04\x44\x41TE\x10\x02\"9\n\x13ListCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"}\n\x15ListAllCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x36\n\x11pagination_params\x18\x02 \x01(\x0b\x32\x1b.gitaly.PaginationParameter\"<\n\x16ListAllCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"T\n\x12\x43ommitStatsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\"n\n\x17\x43ommitIsAncestorRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\"\x81\x01\n\x10TreeEntryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05limit\x18\x04 \x01(\x03\x12\x10\n\x08max_size\x18\x05 \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\"\x9f\x02\n\x13\x43ountCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\x12\x0b\n\x03\x61ll\x18\x07 \x01(\x08\x12\x14\n\x0c\x66irst_parent\x18\x08 \x01(\x08\x12-\n\x0eglobal_options\x18\t \x01(\x0b\x32\x15.gitaly.GlobalOptions\"%\n\x14\x43ountCommitsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\"\x8b\x01\n\x1c\x43ountDivergingCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x66rom\x18\x02 \x01(\x0c\x12\n\n\x02to\x18\x03 \x01(\x0c\x12\x11\n\tmax_count\x18\x07 \x01(\x05J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07\"H\n\x1d\x43ountDivergingCommitsResponse\x12\x12\n\nleft_count\x18\x01 \x01(\x05\x12\x13\n\x0bright_count\x18\x02 \x01(\x05\"\xc3\x01\n\tTreeEntry\x12\x0b\n\x03oid\x18\x01 \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\x03J\x04\x08\x02\x10\x03R\x08root_oid\"\xa5\x02\n\x15GetTreeEntriesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\x11\n\trecursive\x18\x04 \x01(\x08\x12\x32\n\x04sort\x18\x05 \x01(\x0e\x32$.gitaly.GetTreeEntriesRequest.SortBy\x12\x36\n\x11pagination_params\x18\x06 \x01(\x0b\x32\x1b.gitaly.PaginationParameter\x12\x17\n\x0fskip_flat_paths\x18\x07 \x01(\x08\"&\n\x06SortBy\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0f\n\x0bTREES_FIRST\x10\x01\"q\n\x16GetTreeEntriesResponse\x12\"\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x11.gitaly.TreeEntry\x12\x33\n\x11pagination_cursor\x18\x02 \x01(\x0b\x32\x18.gitaly.PaginationCursor\"w\n\x13GetTreeEntriesError\x12\x34\n\x0cresolve_tree\x18\x01 \x01(\x0b\x32\x1c.gitaly.ResolveRevisionErrorH\x00\x12!\n\x04path\x18\x02 \x01(\x0b\x32\x11.gitaly.PathErrorH\x00\x42\x07\n\x05\x65rror\"R\n\x10ListFilesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\"\n\x11ListFilesResponse\x12\r\n\x05paths\x18\x01 \x03(\x0c\"e\n\x11\x46indCommitRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x10\n\x08trailers\x18\x03 \x01(\x08\"7\n\x12\x46indCommitResponse\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\"T\n\x17ListCommitsByOidRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0b\n\x03oid\x18\x02 \x03(\t\">\n\x18ListCommitsByOidResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"^\n\x1bListCommitsByRefNameRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\tref_names\x18\x02 \x03(\x0c\"\xb1\x01\n\x1cListCommitsByRefNameResponse\x12\x46\n\x0b\x63ommit_refs\x18\x02 \x03(\x0b\x32\x31.gitaly.ListCommitsByRefNameResponse.CommitForRef\x1a\x43\n\x0c\x43ommitForRef\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\x12\x10\n\x08ref_name\x18\x02 \x01(\x0cJ\x04\x08\x01\x10\x02\"\xd3\x01\n\x15\x46indAllCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\"\x94\x04\n\x12\x46indCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\x18\n\x0c\x64isable_walk\x18\x08 \x01(\x08\x42\x02\x18\x01\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\x12\x0b\n\x03\x61ll\x18\x0b \x01(\x08\x12\x14\n\x0c\x66irst_parent\x18\x0c \x01(\x08\x12\x0e\n\x06\x61uthor\x18\r \x01(\x0c\x12/\n\x05order\x18\x0e \x01(\x0e\x32 .gitaly.FindCommitsRequest.Order\x12-\n\x0eglobal_options\x18\x0f \x01(\x0b\x32\x15.gitaly.GlobalOptions\x12\x10\n\x08trailers\x18\x10 \x01(\x08\x12\x19\n\x11include_shortstat\x18\x11 \x01(\x08\x12\x1d\n\x15include_referenced_by\x18\x12 \x03(\x0c\"\x1b\n\x05Order\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04TOPO\x10\x01\"9\n\x13\x46indCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"X\n\x16\x43ommitLanguagesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\xaf\x01\n\x17\x43ommitLanguagesResponse\x12;\n\tlanguages\x18\x01 \x03(\x0b\x32(.gitaly.CommitLanguagesResponse.Language\x1aW\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\x12\r\n\x05\x62ytes\x18\x05 \x01(\x04J\x04\x08\x04\x10\x05R\nfile_count\"n\n\x0fRawBlameRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05range\x18\x04 \x01(\x0c\" \n\x10RawBlameResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xb5\x01\n\rRawBlameError\x12\x33\n\x0epath_not_found\x18\x01 \x01(\x0b\x32\x19.gitaly.PathNotFoundErrorH\x00\x12=\n\x0cout_of_range\x18\x02 \x01(\x0b\x32%.gitaly.RawBlameError.OutOfRangeErrorH\x00\x1a\'\n\x0fOutOfRangeError\x12\x14\n\x0c\x61\x63tual_lines\x18\x01 \x01(\x04\x42\x07\n\x05\x65rror\"\xb1\x01\n\x18LastCommitForPathRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\x18\n\x10literal_pathspec\x18\x04 \x01(\x08\x12-\n\x0eglobal_options\x18\x05 \x01(\x0b\x32\x15.gitaly.GlobalOptions\">\n\x19LastCommitForPathResponse\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\"\xd9\x01\n\x1dListLastCommitsForTreeRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05limit\x18\x04 \x01(\x05\x12\x0e\n\x06offset\x18\x05 \x01(\x05\x12\x1c\n\x10literal_pathspec\x18\x06 \x01(\x08\x42\x02\x18\x01\x12-\n\x0eglobal_options\x18\x07 \x01(\x0b\x32\x15.gitaly.GlobalOptions\"\xbb\x01\n\x1eListLastCommitsForTreeResponse\x12\x45\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x34.gitaly.ListLastCommitsForTreeResponse.CommitForTree\x1aR\n\rCommitForTree\x12!\n\x06\x63ommit\x18\x02 \x01(\x0b\x32\x11.gitaly.GitCommit\x12\x12\n\npath_bytes\x18\x04 \x01(\x0cJ\x04\x08\x01\x10\x02J\x04\x08\x03\x10\x04\"\xc4\x01\n\x17\x43ommitsByMessageRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\x12-\n\x0eglobal_options\x18\x07 \x01(\x0b\x32\x15.gitaly.GlobalOptions\">\n\x18\x43ommitsByMessageResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"]\n\x1f\x46ilterShasWithSignaturesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04shas\x18\x02 \x03(\x0c\"0\n FilterShasWithSignaturesResponse\x12\x0c\n\x04shas\x18\x01 \x03(\x0c\"^\n\x1aGetCommitSignaturesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x12\n\ncommit_ids\x18\x02 \x03(\t\"\xda\x01\n\x1bGetCommitSignaturesResponse\x12\x11\n\tcommit_id\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x13\n\x0bsigned_text\x18\x03 \x01(\x0c\x12:\n\x06signer\x18\x04 \x01(\x0e\x32*.gitaly.GetCommitSignaturesResponse.Signer\"D\n\x06Signer\x12\x16\n\x12SIGNER_UNSPECIFIED\x10\x00\x12\x0f\n\x0bSIGNER_USER\x10\x01\x12\x11\n\rSIGNER_SYSTEM\x10\x02\"\\\n\x18GetCommitMessagesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x12\n\ncommit_ids\x18\x02 \x03(\t\"?\n\x19GetCommitMessagesResponse\x12\x11\n\tcommit_id\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"[\n\x18\x43heckObjectsExistRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\trevisions\x18\x02 \x03(\x0c\"\x96\x01\n\x19\x43heckObjectsExistResponse\x12\x46\n\trevisions\x18\x01 \x03(\x0b\x32\x33.gitaly.CheckObjectsExistResponse.RevisionExistence\x1a\x31\n\x11RevisionExistence\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x0e\n\x06\x65xists\x18\x02 \x01(\x08\x32\xf1\x10\n\rCommitService\x12P\n\x0bListCommits\x12\x1a.gitaly.ListCommitsRequest\x1a\x1b.gitaly.ListCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12Y\n\x0eListAllCommits\x12\x1d.gitaly.ListAllCommitsRequest\x1a\x1e.gitaly.ListAllCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12]\n\x10\x43ommitIsAncestor\x12\x1f.gitaly.CommitIsAncestorRequest\x1a .gitaly.CommitIsAncestorResponse\"\x06\xfa\x97(\x02\x08\x02\x12J\n\tTreeEntry\x12\x18.gitaly.TreeEntryRequest\x1a\x19.gitaly.TreeEntryResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12Q\n\x0c\x43ountCommits\x12\x1b.gitaly.CountCommitsRequest\x1a\x1c.gitaly.CountCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x12l\n\x15\x43ountDivergingCommits\x12$.gitaly.CountDivergingCommitsRequest\x1a%.gitaly.CountDivergingCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x12Y\n\x0eGetTreeEntries\x12\x1d.gitaly.GetTreeEntriesRequest\x1a\x1e.gitaly.GetTreeEntriesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12J\n\tListFiles\x12\x18.gitaly.ListFilesRequest\x1a\x19.gitaly.ListFilesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12K\n\nFindCommit\x12\x19.gitaly.FindCommitRequest\x1a\x1a.gitaly.FindCommitResponse\"\x06\xfa\x97(\x02\x08\x02\x12N\n\x0b\x43ommitStats\x12\x1a.gitaly.CommitStatsRequest\x1a\x1b.gitaly.CommitStatsResponse\"\x06\xfa\x97(\x02\x08\x02\x12Y\n\x0e\x46indAllCommits\x12\x1d.gitaly.FindAllCommitsRequest\x1a\x1e.gitaly.FindAllCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12P\n\x0b\x46indCommits\x12\x1a.gitaly.FindCommitsRequest\x1a\x1b.gitaly.FindCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12Z\n\x0f\x43ommitLanguages\x12\x1e.gitaly.CommitLanguagesRequest\x1a\x1f.gitaly.CommitLanguagesResponse\"\x06\xfa\x97(\x02\x08\x02\x12G\n\x08RawBlame\x12\x17.gitaly.RawBlameRequest\x1a\x18.gitaly.RawBlameResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12`\n\x11LastCommitForPath\x12 .gitaly.LastCommitForPathRequest\x1a!.gitaly.LastCommitForPathResponse\"\x06\xfa\x97(\x02\x08\x02\x12q\n\x16ListLastCommitsForTree\x12%.gitaly.ListLastCommitsForTreeRequest\x1a&.gitaly.ListLastCommitsForTreeResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12_\n\x10\x43ommitsByMessage\x12\x1f.gitaly.CommitsByMessageRequest\x1a .gitaly.CommitsByMessageResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12_\n\x10ListCommitsByOid\x12\x1f.gitaly.ListCommitsByOidRequest\x1a .gitaly.ListCommitsByOidResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12k\n\x14ListCommitsByRefName\x12#.gitaly.ListCommitsByRefNameRequest\x1a$.gitaly.ListCommitsByRefNameResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12y\n\x18\x46ilterShasWithSignatures\x12\'.gitaly.FilterShasWithSignaturesRequest\x1a(.gitaly.FilterShasWithSignaturesResponse\"\x06\xfa\x97(\x02\x08\x02(\x01\x30\x01\x12h\n\x13GetCommitSignatures\x12\".gitaly.GetCommitSignaturesRequest\x1a#.gitaly.GetCommitSignaturesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x62\n\x11GetCommitMessages\x12 .gitaly.GetCommitMessagesRequest\x1a!.gitaly.GetCommitMessagesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x64\n\x11\x43heckObjectsExist\x12 .gitaly.CheckObjectsExistRequest\x1a!.gitaly.CheckObjectsExistResponse\"\x06\xfa\x97(\x02\x08\x02(\x01\x30\x01\x42\x34Z2gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypbb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x63ommit.proto\x12\x06gitaly\x1a\x0c\x65rrors.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\nlint.proto\x1a\x0cshared.proto\"\xd4\x03\n\x12ListCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\trevisions\x18\x02 \x03(\t\x12\x36\n\x11pagination_params\x18\x03 \x01(\x0b\x32\x1b.gitaly.PaginationParameter\x12/\n\x05order\x18\x04 \x01(\x0e\x32 .gitaly.ListCommitsRequest.Order\x12\x0f\n\x07reverse\x18\x0b \x01(\x08\x12\x13\n\x0bmax_parents\x18\x05 \x01(\r\x12\x14\n\x0c\x64isable_walk\x18\x06 \x01(\x08\x12\x14\n\x0c\x66irst_parent\x18\x07 \x01(\x08\x12)\n\x05\x61\x66ter\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12*\n\x06\x62\x65\x66ore\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x61uthor\x18\n \x01(\x0c\x12\x13\n\x0bignore_case\x18\x0c \x01(\x08\x12\x1f\n\x17\x63ommit_message_patterns\x18\r \x03(\x0c\"%\n\x05Order\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04TOPO\x10\x01\x12\x08\n\x04\x44\x41TE\x10\x02\"9\n\x13ListCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"}\n\x15ListAllCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x36\n\x11pagination_params\x18\x02 \x01(\x0b\x32\x1b.gitaly.PaginationParameter\"<\n\x16ListAllCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"T\n\x12\x43ommitStatsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\"n\n\x17\x43ommitIsAncestorRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\"\x81\x01\n\x10TreeEntryRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05limit\x18\x04 \x01(\x03\x12\x10\n\x08max_size\x18\x05 \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\"\x9f\x02\n\x13\x43ountCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\x12\x0b\n\x03\x61ll\x18\x07 \x01(\x08\x12\x14\n\x0c\x66irst_parent\x18\x08 \x01(\x08\x12-\n\x0eglobal_options\x18\t \x01(\x0b\x32\x15.gitaly.GlobalOptions\"%\n\x14\x43ountCommitsResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\"\x8b\x01\n\x1c\x43ountDivergingCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04\x66rom\x18\x02 \x01(\x0c\x12\n\n\x02to\x18\x03 \x01(\x0c\x12\x11\n\tmax_count\x18\x07 \x01(\x05J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07\"H\n\x1d\x43ountDivergingCommitsResponse\x12\x12\n\nleft_count\x18\x01 \x01(\x05\x12\x13\n\x0bright_count\x18\x02 \x01(\x05\"\xc3\x01\n\tTreeEntry\x12\x0b\n\x03oid\x18\x01 \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\x03J\x04\x08\x02\x10\x03R\x08root_oid\"\xa5\x02\n\x15GetTreeEntriesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\x11\n\trecursive\x18\x04 \x01(\x08\x12\x32\n\x04sort\x18\x05 \x01(\x0e\x32$.gitaly.GetTreeEntriesRequest.SortBy\x12\x36\n\x11pagination_params\x18\x06 \x01(\x0b\x32\x1b.gitaly.PaginationParameter\x12\x17\n\x0fskip_flat_paths\x18\x07 \x01(\x08\"&\n\x06SortBy\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0f\n\x0bTREES_FIRST\x10\x01\"q\n\x16GetTreeEntriesResponse\x12\"\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x11.gitaly.TreeEntry\x12\x33\n\x11pagination_cursor\x18\x02 \x01(\x0b\x32\x18.gitaly.PaginationCursor\"w\n\x13GetTreeEntriesError\x12\x34\n\x0cresolve_tree\x18\x01 \x01(\x0b\x32\x1c.gitaly.ResolveRevisionErrorH\x00\x12!\n\x04path\x18\x02 \x01(\x0b\x32\x11.gitaly.PathErrorH\x00\x42\x07\n\x05\x65rror\"R\n\x10ListFilesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\"\n\x11ListFilesResponse\x12\r\n\x05paths\x18\x01 \x03(\x0c\"e\n\x11\x46indCommitRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x10\n\x08trailers\x18\x03 \x01(\x08\"7\n\x12\x46indCommitResponse\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\"T\n\x17ListCommitsByOidRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0b\n\x03oid\x18\x02 \x03(\t\">\n\x18ListCommitsByOidResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"^\n\x1bListCommitsByRefNameRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\tref_names\x18\x02 \x03(\x0c\"\xb1\x01\n\x1cListCommitsByRefNameResponse\x12\x46\n\x0b\x63ommit_refs\x18\x02 \x03(\x0b\x32\x31.gitaly.ListCommitsByRefNameResponse.CommitForRef\x1a\x43\n\x0c\x43ommitForRef\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\x12\x10\n\x08ref_name\x18\x02 \x01(\x0cJ\x04\x08\x01\x10\x02\"\xd3\x01\n\x15\x46indAllCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\"\x94\x04\n\x12\x46indCommitsRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\x18\n\x0c\x64isable_walk\x18\x08 \x01(\x08\x42\x02\x18\x01\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\x12\x0b\n\x03\x61ll\x18\x0b \x01(\x08\x12\x14\n\x0c\x66irst_parent\x18\x0c \x01(\x08\x12\x0e\n\x06\x61uthor\x18\r \x01(\x0c\x12/\n\x05order\x18\x0e \x01(\x0e\x32 .gitaly.FindCommitsRequest.Order\x12-\n\x0eglobal_options\x18\x0f \x01(\x0b\x32\x15.gitaly.GlobalOptions\x12\x10\n\x08trailers\x18\x10 \x01(\x08\x12\x19\n\x11include_shortstat\x18\x11 \x01(\x08\x12\x1d\n\x15include_referenced_by\x18\x12 \x03(\x0c\"\x1b\n\x05Order\x12\x08\n\x04NONE\x10\x00\x12\x08\n\x04TOPO\x10\x01\"9\n\x13\x46indCommitsResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"\xba\x01\n\x10\x46indCommitsError\x12,\n\nbad_object\x18\x01 \x01(\x0b\x32\x16.gitaly.BadObjectErrorH\x00\x12\x38\n\rambiguous_ref\x18\x02 \x01(\x0b\x32\x1f.gitaly.AmbiguousReferenceErrorH\x00\x12\x35\n\rinvalid_range\x18\x03 \x01(\x0b\x32\x1c.gitaly.InvalidRevisionRangeH\x00\x42\x07\n\x05\x65rror\"X\n\x16\x43ommitLanguagesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\"\xaf\x01\n\x17\x43ommitLanguagesResponse\x12;\n\tlanguages\x18\x01 \x03(\x0b\x32(.gitaly.CommitLanguagesResponse.Language\x1aW\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\x12\r\n\x05\x62ytes\x18\x05 \x01(\x04J\x04\x08\x04\x10\x05R\nfile_count\"n\n\x0fRawBlameRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05range\x18\x04 \x01(\x0c\" \n\x10RawBlameResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xb5\x01\n\rRawBlameError\x12\x33\n\x0epath_not_found\x18\x01 \x01(\x0b\x32\x19.gitaly.PathNotFoundErrorH\x00\x12=\n\x0cout_of_range\x18\x02 \x01(\x0b\x32%.gitaly.RawBlameError.OutOfRangeErrorH\x00\x1a\'\n\x0fOutOfRangeError\x12\x14\n\x0c\x61\x63tual_lines\x18\x01 \x01(\x04\x42\x07\n\x05\x65rror\"\xb1\x01\n\x18LastCommitForPathRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\x0c\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\x18\n\x10literal_pathspec\x18\x04 \x01(\x08\x12-\n\x0eglobal_options\x18\x05 \x01(\x0b\x32\x15.gitaly.GlobalOptions\">\n\x19LastCommitForPathResponse\x12!\n\x06\x63ommit\x18\x01 \x01(\x0b\x32\x11.gitaly.GitCommit\"\xd9\x01\n\x1dListLastCommitsForTreeRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x10\n\x08revision\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\x0c\x12\r\n\x05limit\x18\x04 \x01(\x05\x12\x0e\n\x06offset\x18\x05 \x01(\x05\x12\x1c\n\x10literal_pathspec\x18\x06 \x01(\x08\x42\x02\x18\x01\x12-\n\x0eglobal_options\x18\x07 \x01(\x0b\x32\x15.gitaly.GlobalOptions\"\xbb\x01\n\x1eListLastCommitsForTreeResponse\x12\x45\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x34.gitaly.ListLastCommitsForTreeResponse.CommitForTree\x1aR\n\rCommitForTree\x12!\n\x06\x63ommit\x18\x02 \x01(\x0b\x32\x11.gitaly.GitCommit\x12\x12\n\npath_bytes\x18\x04 \x01(\x0cJ\x04\x08\x01\x10\x02J\x04\x08\x03\x10\x04\"\xc4\x01\n\x17\x43ommitsByMessageRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\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\x12-\n\x0eglobal_options\x18\x07 \x01(\x0b\x32\x15.gitaly.GlobalOptions\">\n\x18\x43ommitsByMessageResponse\x12\"\n\x07\x63ommits\x18\x01 \x03(\x0b\x32\x11.gitaly.GitCommit\"]\n\x1f\x46ilterShasWithSignaturesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x0c\n\x04shas\x18\x02 \x03(\x0c\"0\n FilterShasWithSignaturesResponse\x12\x0c\n\x04shas\x18\x01 \x03(\x0c\"^\n\x1aGetCommitSignaturesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x12\n\ncommit_ids\x18\x02 \x03(\t\"\xda\x01\n\x1bGetCommitSignaturesResponse\x12\x11\n\tcommit_id\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x13\n\x0bsigned_text\x18\x03 \x01(\x0c\x12:\n\x06signer\x18\x04 \x01(\x0e\x32*.gitaly.GetCommitSignaturesResponse.Signer\"D\n\x06Signer\x12\x16\n\x12SIGNER_UNSPECIFIED\x10\x00\x12\x0f\n\x0bSIGNER_USER\x10\x01\x12\x11\n\rSIGNER_SYSTEM\x10\x02\"\\\n\x18GetCommitMessagesRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x12\n\ncommit_ids\x18\x02 \x03(\t\"?\n\x19GetCommitMessagesResponse\x12\x11\n\tcommit_id\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"[\n\x18\x43heckObjectsExistRequest\x12,\n\nrepository\x18\x01 \x01(\x0b\x32\x12.gitaly.RepositoryB\x04\x98\xc6,\x01\x12\x11\n\trevisions\x18\x02 \x03(\x0c\"\x96\x01\n\x19\x43heckObjectsExistResponse\x12\x46\n\trevisions\x18\x01 \x03(\x0b\x32\x33.gitaly.CheckObjectsExistResponse.RevisionExistence\x1a\x31\n\x11RevisionExistence\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x0e\n\x06\x65xists\x18\x02 \x01(\x08\x32\xf1\x10\n\rCommitService\x12P\n\x0bListCommits\x12\x1a.gitaly.ListCommitsRequest\x1a\x1b.gitaly.ListCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12Y\n\x0eListAllCommits\x12\x1d.gitaly.ListAllCommitsRequest\x1a\x1e.gitaly.ListAllCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12]\n\x10\x43ommitIsAncestor\x12\x1f.gitaly.CommitIsAncestorRequest\x1a .gitaly.CommitIsAncestorResponse\"\x06\xfa\x97(\x02\x08\x02\x12J\n\tTreeEntry\x12\x18.gitaly.TreeEntryRequest\x1a\x19.gitaly.TreeEntryResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12Q\n\x0c\x43ountCommits\x12\x1b.gitaly.CountCommitsRequest\x1a\x1c.gitaly.CountCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x12l\n\x15\x43ountDivergingCommits\x12$.gitaly.CountDivergingCommitsRequest\x1a%.gitaly.CountDivergingCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x12Y\n\x0eGetTreeEntries\x12\x1d.gitaly.GetTreeEntriesRequest\x1a\x1e.gitaly.GetTreeEntriesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12J\n\tListFiles\x12\x18.gitaly.ListFilesRequest\x1a\x19.gitaly.ListFilesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12K\n\nFindCommit\x12\x19.gitaly.FindCommitRequest\x1a\x1a.gitaly.FindCommitResponse\"\x06\xfa\x97(\x02\x08\x02\x12N\n\x0b\x43ommitStats\x12\x1a.gitaly.CommitStatsRequest\x1a\x1b.gitaly.CommitStatsResponse\"\x06\xfa\x97(\x02\x08\x02\x12Y\n\x0e\x46indAllCommits\x12\x1d.gitaly.FindAllCommitsRequest\x1a\x1e.gitaly.FindAllCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12P\n\x0b\x46indCommits\x12\x1a.gitaly.FindCommitsRequest\x1a\x1b.gitaly.FindCommitsResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12Z\n\x0f\x43ommitLanguages\x12\x1e.gitaly.CommitLanguagesRequest\x1a\x1f.gitaly.CommitLanguagesResponse\"\x06\xfa\x97(\x02\x08\x02\x12G\n\x08RawBlame\x12\x17.gitaly.RawBlameRequest\x1a\x18.gitaly.RawBlameResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12`\n\x11LastCommitForPath\x12 .gitaly.LastCommitForPathRequest\x1a!.gitaly.LastCommitForPathResponse\"\x06\xfa\x97(\x02\x08\x02\x12q\n\x16ListLastCommitsForTree\x12%.gitaly.ListLastCommitsForTreeRequest\x1a&.gitaly.ListLastCommitsForTreeResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12_\n\x10\x43ommitsByMessage\x12\x1f.gitaly.CommitsByMessageRequest\x1a .gitaly.CommitsByMessageResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12_\n\x10ListCommitsByOid\x12\x1f.gitaly.ListCommitsByOidRequest\x1a .gitaly.ListCommitsByOidResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12k\n\x14ListCommitsByRefName\x12#.gitaly.ListCommitsByRefNameRequest\x1a$.gitaly.ListCommitsByRefNameResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12y\n\x18\x46ilterShasWithSignatures\x12\'.gitaly.FilterShasWithSignaturesRequest\x1a(.gitaly.FilterShasWithSignaturesResponse\"\x06\xfa\x97(\x02\x08\x02(\x01\x30\x01\x12h\n\x13GetCommitSignatures\x12\".gitaly.GetCommitSignaturesRequest\x1a#.gitaly.GetCommitSignaturesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x62\n\x11GetCommitMessages\x12 .gitaly.GetCommitMessagesRequest\x1a!.gitaly.GetCommitMessagesResponse\"\x06\xfa\x97(\x02\x08\x02\x30\x01\x12\x64\n\x11\x43heckObjectsExist\x12 .gitaly.CheckObjectsExistRequest\x1a!.gitaly.CheckObjectsExistResponse\"\x06\xfa\x97(\x02\x08\x02(\x01\x30\x01\x42\x34Z2gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypbb\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -196,54 +196,56 @@
   _globals['_FINDCOMMITSREQUEST_ORDER']._serialized_end=556
   _globals['_FINDCOMMITSRESPONSE']._serialized_start=4239
   _globals['_FINDCOMMITSRESPONSE']._serialized_end=4296
-  _globals['_COMMITLANGUAGESREQUEST']._serialized_start=4298
-  _globals['_COMMITLANGUAGESREQUEST']._serialized_end=4386
-  _globals['_COMMITLANGUAGESRESPONSE']._serialized_start=4389
-  _globals['_COMMITLANGUAGESRESPONSE']._serialized_end=4564
-  _globals['_COMMITLANGUAGESRESPONSE_LANGUAGE']._serialized_start=4477
-  _globals['_COMMITLANGUAGESRESPONSE_LANGUAGE']._serialized_end=4564
-  _globals['_RAWBLAMEREQUEST']._serialized_start=4566
-  _globals['_RAWBLAMEREQUEST']._serialized_end=4676
-  _globals['_RAWBLAMERESPONSE']._serialized_start=4678
-  _globals['_RAWBLAMERESPONSE']._serialized_end=4710
-  _globals['_RAWBLAMEERROR']._serialized_start=4713
-  _globals['_RAWBLAMEERROR']._serialized_end=4894
-  _globals['_RAWBLAMEERROR_OUTOFRANGEERROR']._serialized_start=4846
-  _globals['_RAWBLAMEERROR_OUTOFRANGEERROR']._serialized_end=4885
-  _globals['_LASTCOMMITFORPATHREQUEST']._serialized_start=4897
-  _globals['_LASTCOMMITFORPATHREQUEST']._serialized_end=5074
-  _globals['_LASTCOMMITFORPATHRESPONSE']._serialized_start=5076
-  _globals['_LASTCOMMITFORPATHRESPONSE']._serialized_end=5138
-  _globals['_LISTLASTCOMMITSFORTREEREQUEST']._serialized_start=5141
-  _globals['_LISTLASTCOMMITSFORTREEREQUEST']._serialized_end=5358
-  _globals['_LISTLASTCOMMITSFORTREERESPONSE']._serialized_start=5361
-  _globals['_LISTLASTCOMMITSFORTREERESPONSE']._serialized_end=5548
-  _globals['_LISTLASTCOMMITSFORTREERESPONSE_COMMITFORTREE']._serialized_start=5466
-  _globals['_LISTLASTCOMMITSFORTREERESPONSE_COMMITFORTREE']._serialized_end=5548
-  _globals['_COMMITSBYMESSAGEREQUEST']._serialized_start=5551
-  _globals['_COMMITSBYMESSAGEREQUEST']._serialized_end=5747
-  _globals['_COMMITSBYMESSAGERESPONSE']._serialized_start=5749
-  _globals['_COMMITSBYMESSAGERESPONSE']._serialized_end=5811
-  _globals['_FILTERSHASWITHSIGNATURESREQUEST']._serialized_start=5813
-  _globals['_FILTERSHASWITHSIGNATURESREQUEST']._serialized_end=5906
-  _globals['_FILTERSHASWITHSIGNATURESRESPONSE']._serialized_start=5908
-  _globals['_FILTERSHASWITHSIGNATURESRESPONSE']._serialized_end=5956
-  _globals['_GETCOMMITSIGNATURESREQUEST']._serialized_start=5958
-  _globals['_GETCOMMITSIGNATURESREQUEST']._serialized_end=6052
-  _globals['_GETCOMMITSIGNATURESRESPONSE']._serialized_start=6055
-  _globals['_GETCOMMITSIGNATURESRESPONSE']._serialized_end=6273
-  _globals['_GETCOMMITSIGNATURESRESPONSE_SIGNER']._serialized_start=6205
-  _globals['_GETCOMMITSIGNATURESRESPONSE_SIGNER']._serialized_end=6273
-  _globals['_GETCOMMITMESSAGESREQUEST']._serialized_start=6275
-  _globals['_GETCOMMITMESSAGESREQUEST']._serialized_end=6367
-  _globals['_GETCOMMITMESSAGESRESPONSE']._serialized_start=6369
-  _globals['_GETCOMMITMESSAGESRESPONSE']._serialized_end=6432
-  _globals['_CHECKOBJECTSEXISTREQUEST']._serialized_start=6434
-  _globals['_CHECKOBJECTSEXISTREQUEST']._serialized_end=6525
-  _globals['_CHECKOBJECTSEXISTRESPONSE']._serialized_start=6528
-  _globals['_CHECKOBJECTSEXISTRESPONSE']._serialized_end=6678
-  _globals['_CHECKOBJECTSEXISTRESPONSE_REVISIONEXISTENCE']._serialized_start=6629
-  _globals['_CHECKOBJECTSEXISTRESPONSE_REVISIONEXISTENCE']._serialized_end=6678
-  _globals['_COMMITSERVICE']._serialized_start=6681
-  _globals['_COMMITSERVICE']._serialized_end=8842
+  _globals['_FINDCOMMITSERROR']._serialized_start=4299
+  _globals['_FINDCOMMITSERROR']._serialized_end=4485
+  _globals['_COMMITLANGUAGESREQUEST']._serialized_start=4487
+  _globals['_COMMITLANGUAGESREQUEST']._serialized_end=4575
+  _globals['_COMMITLANGUAGESRESPONSE']._serialized_start=4578
+  _globals['_COMMITLANGUAGESRESPONSE']._serialized_end=4753
+  _globals['_COMMITLANGUAGESRESPONSE_LANGUAGE']._serialized_start=4666
+  _globals['_COMMITLANGUAGESRESPONSE_LANGUAGE']._serialized_end=4753
+  _globals['_RAWBLAMEREQUEST']._serialized_start=4755
+  _globals['_RAWBLAMEREQUEST']._serialized_end=4865
+  _globals['_RAWBLAMERESPONSE']._serialized_start=4867
+  _globals['_RAWBLAMERESPONSE']._serialized_end=4899
+  _globals['_RAWBLAMEERROR']._serialized_start=4902
+  _globals['_RAWBLAMEERROR']._serialized_end=5083
+  _globals['_RAWBLAMEERROR_OUTOFRANGEERROR']._serialized_start=5035
+  _globals['_RAWBLAMEERROR_OUTOFRANGEERROR']._serialized_end=5074
+  _globals['_LASTCOMMITFORPATHREQUEST']._serialized_start=5086
+  _globals['_LASTCOMMITFORPATHREQUEST']._serialized_end=5263
+  _globals['_LASTCOMMITFORPATHRESPONSE']._serialized_start=5265
+  _globals['_LASTCOMMITFORPATHRESPONSE']._serialized_end=5327
+  _globals['_LISTLASTCOMMITSFORTREEREQUEST']._serialized_start=5330
+  _globals['_LISTLASTCOMMITSFORTREEREQUEST']._serialized_end=5547
+  _globals['_LISTLASTCOMMITSFORTREERESPONSE']._serialized_start=5550
+  _globals['_LISTLASTCOMMITSFORTREERESPONSE']._serialized_end=5737
+  _globals['_LISTLASTCOMMITSFORTREERESPONSE_COMMITFORTREE']._serialized_start=5655
+  _globals['_LISTLASTCOMMITSFORTREERESPONSE_COMMITFORTREE']._serialized_end=5737
+  _globals['_COMMITSBYMESSAGEREQUEST']._serialized_start=5740
+  _globals['_COMMITSBYMESSAGEREQUEST']._serialized_end=5936
+  _globals['_COMMITSBYMESSAGERESPONSE']._serialized_start=5938
+  _globals['_COMMITSBYMESSAGERESPONSE']._serialized_end=6000
+  _globals['_FILTERSHASWITHSIGNATURESREQUEST']._serialized_start=6002
+  _globals['_FILTERSHASWITHSIGNATURESREQUEST']._serialized_end=6095
+  _globals['_FILTERSHASWITHSIGNATURESRESPONSE']._serialized_start=6097
+  _globals['_FILTERSHASWITHSIGNATURESRESPONSE']._serialized_end=6145
+  _globals['_GETCOMMITSIGNATURESREQUEST']._serialized_start=6147
+  _globals['_GETCOMMITSIGNATURESREQUEST']._serialized_end=6241
+  _globals['_GETCOMMITSIGNATURESRESPONSE']._serialized_start=6244
+  _globals['_GETCOMMITSIGNATURESRESPONSE']._serialized_end=6462
+  _globals['_GETCOMMITSIGNATURESRESPONSE_SIGNER']._serialized_start=6394
+  _globals['_GETCOMMITSIGNATURESRESPONSE_SIGNER']._serialized_end=6462
+  _globals['_GETCOMMITMESSAGESREQUEST']._serialized_start=6464
+  _globals['_GETCOMMITMESSAGESREQUEST']._serialized_end=6556
+  _globals['_GETCOMMITMESSAGESRESPONSE']._serialized_start=6558
+  _globals['_GETCOMMITMESSAGESRESPONSE']._serialized_end=6621
+  _globals['_CHECKOBJECTSEXISTREQUEST']._serialized_start=6623
+  _globals['_CHECKOBJECTSEXISTREQUEST']._serialized_end=6714
+  _globals['_CHECKOBJECTSEXISTRESPONSE']._serialized_start=6717
+  _globals['_CHECKOBJECTSEXISTRESPONSE']._serialized_end=6867
+  _globals['_CHECKOBJECTSEXISTRESPONSE_REVISIONEXISTENCE']._serialized_start=6818
+  _globals['_CHECKOBJECTSEXISTRESPONSE_REVISIONEXISTENCE']._serialized_end=6867
+  _globals['_COMMITSERVICE']._serialized_start=6870
+  _globals['_COMMITSERVICE']._serialized_end=9031
 # @@protoc_insertion_point(module_scope)
diff --git a/hgitaly/stub/errors_pb2.py b/hgitaly/stub/errors_pb2.py
index 9333633b4fb4fc6e84cb0ee30b22fed537d15879_aGdpdGFseS9zdHViL2Vycm9yc19wYjIucHk=..78b94b19c00e4008ddb634b01f96a97fb5d1cc6d_aGdpdGFseS9zdHViL2Vycm9yc19wYjIucHk= 100644
--- a/hgitaly/stub/errors_pb2.py
+++ b/hgitaly/stub/errors_pb2.py
@@ -14,7 +14,7 @@
 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(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\"k\n\x1bReferenceStateMismatchError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\x12\x1a\n\x12\x65xpected_object_id\x18\x02 \x01(\x0c\x12\x18\n\x10\x61\x63tual_object_id\x18\x03 \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\"\xf8\x01\n\tPathError\x12\x0c\n\x04path\x18\x01 \x01(\x0c\x12/\n\nerror_type\x18\x02 \x01(\x0e\x32\x1b.gitaly.PathError.ErrorType\"\xab\x01\n\tErrorType\x12\x1a\n\x16\x45RROR_TYPE_UNSPECIFIED\x10\x00\x12\x19\n\x15\x45RROR_TYPE_EMPTY_PATH\x10\x01\x12/\n+ERROR_TYPE_RELATIVE_PATH_ESCAPES_REPOSITORY\x10\x02\x12\x1c\n\x18\x45RROR_TYPE_ABSOLUTE_PATH\x10\x03\x12\x18\n\x14\x45RROR_TYPE_LONG_PATH\x10\x04\"!\n\x11PathNotFoundError\x12\x0c\n\x04path\x18\x01 \x01(\x0c\x42\x34Z2gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypbb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(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\"k\n\x1bReferenceStateMismatchError\x12\x16\n\x0ereference_name\x18\x01 \x01(\x0c\x12\x1a\n\x12\x65xpected_object_id\x18\x02 \x01(\x0c\x12\x18\n\x10\x61\x63tual_object_id\x18\x03 \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\"\xf8\x01\n\tPathError\x12\x0c\n\x04path\x18\x01 \x01(\x0c\x12/\n\nerror_type\x18\x02 \x01(\x0e\x32\x1b.gitaly.PathError.ErrorType\"\xab\x01\n\tErrorType\x12\x1a\n\x16\x45RROR_TYPE_UNSPECIFIED\x10\x00\x12\x19\n\x15\x45RROR_TYPE_EMPTY_PATH\x10\x01\x12/\n+ERROR_TYPE_RELATIVE_PATH_ESCAPES_REPOSITORY\x10\x02\x12\x1c\n\x18\x45RROR_TYPE_ABSOLUTE_PATH\x10\x03\x12\x18\n\x14\x45RROR_TYPE_LONG_PATH\x10\x04\"!\n\x11PathNotFoundError\x12\x0c\n\x04path\x18\x01 \x01(\x0c\",\n\x17\x41mbiguousReferenceError\x12\x11\n\treference\x18\x01 \x01(\x0c\"#\n\x0e\x42\x61\x64ObjectError\x12\x11\n\tobject_id\x18\x01 \x01(\x0c\"%\n\x14InvalidRevisionRange\x12\r\n\x05range\x18\x01 \x01(\x0c\x42\x34Z2gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypbb\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -61,4 +61,10 @@
   _globals['_PATHERROR_ERRORTYPE']._serialized_end=1611
   _globals['_PATHNOTFOUNDERROR']._serialized_start=1613
   _globals['_PATHNOTFOUNDERROR']._serialized_end=1646
+  _globals['_AMBIGUOUSREFERENCEERROR']._serialized_start=1648
+  _globals['_AMBIGUOUSREFERENCEERROR']._serialized_end=1692
+  _globals['_BADOBJECTERROR']._serialized_start=1694
+  _globals['_BADOBJECTERROR']._serialized_end=1729
+  _globals['_INVALIDREVISIONRANGE']._serialized_start=1731
+  _globals['_INVALIDREVISIONRANGE']._serialized_end=1768
 # @@protoc_insertion_point(module_scope)
diff --git a/protos/commit.proto b/protos/commit.proto
index 9333633b4fb4fc6e84cb0ee30b22fed537d15879_cHJvdG9zL2NvbW1pdC5wcm90bw==..78b94b19c00e4008ddb634b01f96a97fb5d1cc6d_cHJvdG9zL2NvbW1pdC5wcm90bw== 100644
--- a/protos/commit.proto
+++ b/protos/commit.proto
@@ -391,7 +391,7 @@
   GlobalOptions global_options = 9;
 }
 
-// CountCommitsResponse is the response for the CountCommits RPC. 
+// CountCommitsResponse is the response for the CountCommits RPC.
 message CountCommitsResponse {
   // count denotes the number of commits found as per the given filters.
   int32 count = 1;
@@ -683,6 +683,20 @@
   repeated GitCommit commits = 1;
 }
 
+// FindCommitsError is an error returned by the FindCommits RPC when no commit is found.
+message FindCommitsError {
+
+  // error denotes the type of error encountered.
+  oneof error {
+    // bad_object is returned when the revision cannot be found in the git repository.
+    BadObjectError bad_object = 1;
+    // ambiguous_ref is returned when the given revision cannot be found.
+    AmbiguousReferenceError ambiguous_ref = 2;
+    // invalid_range is returned when the provided revision-range cannot be found in the git repository.
+    InvalidRevisionRange invalid_range = 3;
+  }
+}
+
 // CommitLanguagesRequest requests to detect the source code languages.
 message CommitLanguagesRequest {
   // repository is the repository where to detect the languages in.
diff --git a/protos/errors.proto b/protos/errors.proto
index 9333633b4fb4fc6e84cb0ee30b22fed537d15879_cHJvdG9zL2Vycm9ycy5wcm90bw==..78b94b19c00e4008ddb634b01f96a97fb5d1cc6d_cHJvdG9zL2Vycm9ycy5wcm90bw== 100644
--- a/protos/errors.proto
+++ b/protos/errors.proto
@@ -205,3 +205,21 @@
   // path is the path that could not be found.
   bytes path = 1;
 }
+
+// AmbiguousReferenceError is an error returned when an reference is unknown.
+message AmbiguousReferenceError {
+  // reference is the reference passed to the git command.
+  bytes reference = 1;
+}
+// BadObjectError is an error returned when git cannot find a valid object based on its id.
+message BadObjectError {
+  // object_id is the object id passed to the git command.
+  bytes object_id = 1;
+}
+
+// InvalidRevisionRange is an error returned when the range given to the git log command is invalid.
+message InvalidRevisionRange {
+  // range is the commit range passed to git log command.
+  bytes range = 1;
+}
+
diff --git a/protos/hook.proto b/protos/hook.proto
index 9333633b4fb4fc6e84cb0ee30b22fed537d15879_cHJvdG9zL2hvb2sucHJvdG8=..78b94b19c00e4008ddb634b01f96a97fb5d1cc6d_cHJvdG9zL2hvb2sucHJvdG8= 100644
--- a/protos/hook.proto
+++ b/protos/hook.proto
@@ -48,6 +48,15 @@
     };
   }
 
+  // ProcReceiveHook is a hook invoked by git-receive-pack(1) [1]. This hook is responsible
+  // for updating the relevant references and reporting the results back to receive-pack.
+  //
+  // [1]: https://git-scm.com/docs/githooks#proc-receive
+  rpc ProcReceiveHook(stream ProcReceiveHookRequest) returns (stream ProcReceiveHookResponse) {
+    option (op_type) = {
+      op: MUTATOR
+    };
+  };
 }
 
 // PreReceiveHookRequest ...
@@ -170,3 +179,25 @@
 // PackObjectsHookWithSidechannelResponse ...
 message PackObjectsHookWithSidechannelResponse {
 }
+
+// ProcReceiveHookRequest is the request for the ProcReceiveHook RPC.
+message ProcReceiveHookRequest {
+  // repository is the repository the hook operates on. This field is unused
+  // currently since we gather all information from stdin.
+  Repository repository = 1 [(target_repository)=true];
+  // environment_variables is the set of env variables to be passed to the RPC.
+  repeated string environment_variables = 2;
+  // stdin is a chunk of raw data which the hook receives.
+  bytes stdin = 3;
+}
+
+// ProcReceiveHookResponse is the response for the ProcReceiveHook RPC.
+message ProcReceiveHookResponse {
+  // stdout is a chunk of raw data to be output to stdout of the hook.
+  bytes stdout = 1;
+  // stderr is a chunk of raw data to be output to stderr of the hook.
+  bytes stderr = 2;
+  // exit_status is the exit status that the hooks outputs, this dictates the
+  // success/failure of git-receive-pack(1).
+  ExitStatus exit_status = 3;
+}
diff --git a/protos/log.proto b/protos/log.proto
index 9333633b4fb4fc6e84cb0ee30b22fed537d15879_cHJvdG9zL2xvZy5wcm90bw==..78b94b19c00e4008ddb634b01f96a97fb5d1cc6d_cHJvdG9zL2xvZy5wcm90bw== 100644
--- a/protos/log.proto
+++ b/protos/log.proto
@@ -60,6 +60,22 @@
     string path = 1;
   }
 
+  // Housekeeping models a housekeeping run. It is supposed to handle housekeeping tasks for repositories such as the
+  // cleanup of unneeded files and optimizations for the repository's data structures. It is a collection of smaller
+  // tasks.
+  message Housekeeping {
+    // PackRefs models a pack-refs housekeeping task. This task is to pack loose references into a singular packed-refs
+    // file to optimize ref accessing time. In other words, it's a wrapper for git-pack-refs command.
+    message PackRefs {
+      // pruned_refs is the list of fully qualified references to be pruned. Gitaly removes the loose reference files on
+      // the disk. They still stay intact in the packed-refs.
+      repeated bytes pruned_refs = 1;
+    }
+
+    // pack_refs signifies if the housekeeping run includes a pack-refs task.
+    PackRefs pack_refs = 1;
+  }
+
   // relative_path is the relative path of the repository the changes in the
   // log entry are targeting.
   string relative_path = 1;
@@ -82,6 +98,8 @@
   RepositoryCreation repository_creation = 7;
   // alternate_update records a change to the repository's 'objects/info/alternates' file.
   AlternateUpdate alternate_update = 8;
+  // housekeeping, when set, indicates this log entry contains a housekeeping task.
+  Housekeeping housekeeping = 9;
 }
 
 // LSN serializes a log sequence number. It's used for storing a partition's