threads / discuss / 61699

[QUESTION]: How to get uploading git objects via a git command in a pre-receive-hook

Subject: [QUESTION]: How to get uploading git objects via a git command in a pre-receive-hook

## tl;dr

3 messages between Jun 29, 2024 and Jul 1, 2024.

replies: 2people: 3as markdown or json

ZheNing Hu· Jun 29, 2024, 14:42 UTC · lore
Hi,

I want to check the uploaded Git LFS objects in the pre-receive hook of the Git server. Assuming that the Git repository during the upload process is A.git, my current approach is to create an empty repository B.git and then use GIT_ALTERNATE_OBJECT_DIRECTORIES="A.git/objects/tmp_objdir-incoming-**" followed by executing git -C B.git cat-file --batch-check --batch-all-objects to obtain the objects being uploaded, then filter out the LFS objects. This process is very time-consuming, taking roughly more than 10 seconds. I wonder if there's a simpler method?

Thanks. -- ZheNing Hu

Christian Couder· Jun 29, 2024, 16:29 UTC · re: ZheNing Hu · lore

Re: [QUESTION]: How to get uploading git objects via a git command in a pre-receive-hook

Hi ZheNing,
On Sat, Jun 29, 2024 at 4:42 PM ZheNing Hu <adlternative@gmail.com> wrote:
Show 12 quoted lines
>
> Hi,
>
> I want to check the uploaded Git LFS objects in the pre-receive hook
> of the Git server. Assuming that the Git repository during the upload
> process is A.git, my current approach is to create an empty repository
> B.git and then use
> GIT_ALTERNATE_OBJECT_DIRECTORIES="A.git/objects/tmp_objdir-incoming-**"
> followed by executing git -C B.git cat-file --batch-check
> --batch-all-objects to obtain the objects being uploaded, then filter
> out the LFS objects. This process is very time-consuming, taking
> roughly more than 10 seconds. I wonder if there's a simpler method?

I wonder if it's possible to use `git verify-pack --verbose` on the received packfile.

Best, Christian.

Jeff King· Jul 1, 2024, 03:40 UTC · re: Christian Couder · lore

Re: [QUESTION]: How to get uploading git objects via a git command in a pre-receive-hook

On Sat, Jun 29, 2024 at 06:29:41PM +0200, Christian Couder wrote:
Show 12 quoted lines
> > I want to check the uploaded Git LFS objects in the pre-receive hook
> > of the Git server. Assuming that the Git repository during the upload
> > process is A.git, my current approach is to create an empty repository
> > B.git and then use
> > GIT_ALTERNATE_OBJECT_DIRECTORIES="A.git/objects/tmp_objdir-incoming-**"
> > followed by executing git -C B.git cat-file --batch-check
> > --batch-all-objects to obtain the objects being uploaded, then filter
> > out the LFS objects. This process is very time-consuming, taking
> > roughly more than 10 seconds. I wonder if there's a simpler method?
> 
> I wonder if it's possible to use `git verify-pack --verbose` on the
> received packfile.

By the time the pre-receive hook is running, we've indexed the pack. So you can just find the pack in the tmpdir (via GIT_QUARANTINE_PATH) and run "git show-index" against it, which is much faster. Keeping in mind that the pack could also have been exploded to loose objects if it's small, in which case you'd need to use "find" or similar to enumerate the loose object files.

In theory you could use "cat-file --batch-all-objects", but I suspect the reason it takes a long time is that it has access to all of the original objects in the repo, too (and so is enumerating those). You might be able to get away with unsetting various GIT_* variables to avoid that, but I think the result would be kind of fragile.

-Peff

← back to recent threads