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

Re: Pushing a git repository to a new server

From
KKKonstantin Khomoutov <kostix+git@007spb.ru>
Date
Feb 11, 2013, 12:45 UTC
Message-ID
<20130211164518.ad0a21aff672ad0e4f03a6bb@domain007.com>
In-Reply-To
<CAE_TNin6-weutRDToZ7-BBGJTCcf0dwJn0ChUbFcACRU=SbjzA@mail.gmail.com>

On Mon, 11 Feb 2013 02:57:51 -0500 Ethan Reesor <firelizzard@gmail.com> wrote:

[...]
> I want to create a git-command that 1) creates a bare version of the
> current repo, 2) and uploads it to the specified path on my server
> (using tar, but that's not the point).
Thanks, it's now a bit more clear.
> My problem is that I have no idea how things like git-push works via a
> user with git-shell. Can you only run certain git commands, like
> git-upload-pack?
[...]

Precisely so. With additional twist that you can create (or link) other commands under ~/git-shell-commands, and these will be available as well.

OK, here's the sketch. On the server, in the home directory of your "git" user, you create a wrapper around git-receive-pack, like this:

# mkdir ~git/git-shell-commands # cat >~git/git-shell-commands/git-receive-new-repo #!/bin/sh

set -e -u
if [ $# -ne 1 ]; then
        echo 'Missing required argument: <directory>' >&2
        exit 1
fi

mkdir "$1" && git init --quiet --bare "$1" && git-receive-pack "$1" ^D # chmod +x $_

Then, on the client side, to push a new repo, you just do
$ git push --receive-pack=git-receive-new-repo --all git@server:repo.git

This will make `git push` to spawn not just `git receive-pack <dir>` as it usually does but your wrapper, which would first create and initialize a bare repository and then spawn `git receive-pack` on it which would then communicate with the client side and receive everything from it.

You could then create a client-side wrapper script or a Git alias for such "creative pushing", like this:

$ git config --add --global alias.push-new-repo \
  'push --receive-pack=git-receive-new-repo --all'
So the whole client call is now reduced to
$ git push-new-repo git@server:repo.git
Previous: Ethan ReesorNext: Ethan Reesor
Message 4 of 10 in “Pushing a git repository to a new server”
  1. Ethan ReesorFeb 10, 2013
  2. Konstantin KhomoutovFeb 11, 2013
  3. Ethan ReesorFeb 11, 2013
  4. Konstantin KhomoutovFeb 11, 2013
  5. Ethan ReesorFeb 11, 2013
  6. Jeff KingFeb 11, 2013
  7. Ethan ReesorFeb 11, 2013
  8. Michael J GruberFeb 12, 2013
  9. Jeff KingFeb 12, 2013
  10. Michael J GruberFeb 13, 2013

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.