git/list[1] front-page[2] threads[3] people[4] search[5] about
 

git pre-push hook not getting the lines from STDIN

From
Wesley <wesleys@opperschaap.net>
Date
Aug 8, 2023, 22:24 UTC
Message-ID
<676330b6-720a-e262-d583-9012e549bba7@opperschaap.net>
Hello list,

I'm trying to figure out how I can check which branches are used in a git push action while using the pre-push hook. In the man page the following is mentioned:

----<

Information about what is to be pushed is provided on the hook’s standard input with lines of the form:

<local ref> SP <local object name> SP <remote ref> SP <remote object name> LF

For instance, if the command `git push origin master:foreign` were run the hook would receive a line like the following:

   refs/heads/master 67890 refs/heads/foreign 12345
----<

I cannot seem to reproduce this behavior with the push action. Only when pushing to delete a remote branch or pushing to a new branch gets created yields any success. I went as far back as git 2.9.0 (I can't build older versions of git), to no avail. The line in the man page seems to indicate git v1.8.2-rc0 was the first tag to have it (ec55559f).

Could someone verify that what I am seeing is correct behavior or that this is incorrect?

As stated, I experience issues on git v2.9.0, 2.40.1 (Debian) and also directly from source 2.42.0.rc0.26.g6ac35453d6.

Thanks, Wesley

----< a new branch

$ git push origin test:fofofo +.git/hooks/pre-push:5> remote=origin +.git/hooks/pre-push:6> url=git@gitlab.com:gitlabmeme/somerepo.git +.git/hooks/pre-push:8> success=128 +.git/hooks/pre-push:10> z40=0000000000000000000000000000000000000000 +.git/hooks/pre-push:11> IFS=' ' +.git/hooks/pre-push:13> read LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA +.git/hooks/pre-push:15> echo refs/heads/test refs/heads/test +.git/hooks/pre-push:16> echo 24a3b84a02937df6040fecce2e0620e16c823b36 24a3b84a02937df6040fecce2e0620e16c823b36 +.git/hooks/pre-push:17> echo refs/heads/fofofo refs/heads/fofofo +.git/hooks/pre-push:18> echo 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 +.git/hooks/pre-push:21> [ refs/heads/test '=' 0000000000000000000000000000000000000000 ']' +.git/hooks/pre-push:23> [ refs/heads/test '=' '(delete)' ']' +.git/hooks/pre-push:30> exit 128

----< deletion of a branch on the remote

$ git push origin :development +.git/hooks/pre-push:5> remote=origin +.git/hooks/pre-push:6> url=git@gitlab.com:gitlabmeme/somerepo.git +.git/hooks/pre-push:8> success=128 +.git/hooks/pre-push:10> z40=0000000000000000000000000000000000000000 +.git/hooks/pre-push:11> IFS=' ' +.git/hooks/pre-push:13> read LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA +.git/hooks/pre-push:15> echo '(delete)' (delete) +.git/hooks/pre-push:16> echo 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 +.git/hooks/pre-push:17> echo refs/heads/development refs/heads/development +.git/hooks/pre-push:18> echo 1762c08fd38c1137bbca27898df7c64ad846f877 1762c08fd38c1137bbca27898df7c64ad846f877 +.git/hooks/pre-push:21> [ '(delete)' '=' 0000000000000000000000000000000000000000 ']' +.git/hooks/pre-push:23> [ '(delete)' '=' '(delete)' ']' +.git/hooks/pre-push:23> exit 128

----<

If I push to an existing repo on my remote I see this: $ git push origin HEAD:development +.git/hooks/pre-push:5> remote=origin +.git/hooks/pre-push:6> url=git@gitlab.com:gitlabmeme/somerepo.git +.git/hooks/pre-push:8> success=128 +.git/hooks/pre-push:10> z40=0000000000000000000000000000000000000000 +.git/hooks/pre-push:11> IFS=' ' +.git/hooks/pre-push:13> read LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA +.git/hooks/pre-push:15> echo

+.git/hooks/pre-push:16> echo
+.git/hooks/pre-push:17> echo
+.git/hooks/pre-push:18> echo

+.git/hooks/pre-push:21> [ '' '=' 0000000000000000000000000000000000000000 ']' +.git/hooks/pre-push:23> [ '' '=' '(delete)' ']' +.git/hooks/pre-push:28> exit 128

----< The pre-push script

#!/usr/bin/env zsh # set -x

remote="$1" url="$2"

success=128

z40=0000000000000000000000000000000000000000 IFS=' '

read LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA

echo $LOCAL_REF echo $LOCAL_SHA echo $REMOTE_REF echo $REMOTE_SHA

# deletion of remote branch [ "$LOCAL_REF" = $z40 ] && exit $success # git 2.40 at least does not have $z40 as a delete [ "$LOCAL_REF" = '(delete)' ] && exit $success

exit $success
-- 
Wesley

Why not both?
Next: Sean Allred
Message 1 of 3 in “git pre-push hook not getting the lines from STDIN”
  1. WesleyAug 8, 2023
  2. Sean AllredAug 9, 2023
  3. WesleyAug 9, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.