Publishing with git + ssh: Difference between revisions

From XPUB & Lens-Based wiki
No edit summary
No edit summary
Line 8: Line 8:


== On you local computer ==
== On you local computer ==
=== Convert local folder into a bare repo ===
=== Convert local folder into a bare repo ===


Line 20: Line 21:
Here assuming you have a folder called git in your remote home folder.
Here assuming you have a folder called git in your remote home folder.


     scp -r project.git remote:git/
     scp -r project.git sshuser@myvps.org:git/
 
or if you have configured a host alias in your .ssh/config (in this case called "myvps").
 
    scp -r project.git myvps:git/


=== add the remote to your original repo ===
=== add the remote to your original repo ===
Line 31: Line 36:
     git push --set-upstream myserver main  
     git push --set-upstream myserver main  


== On the remote server ==
ssh to your server
    ssh server


== clone the bare repo to a (public) working directory on the server ==
== clone the bare repo to a (public) working directory on the server ==

Revision as of 16:28, 9 October 2024

This recipe is to describe the steps for taking a local folder that's managed by git and using a remote server where you have ssh access, creating an "as-simple-as-possible" remote that can be pushed to (and eventually pulled from) and that is also mirrored on the same server. In other words, there's also a public working directory that automatically gets updated (via a githook) when the repo is pushed to. This recipe does not require that you use a git server like gitea, gitlab, or github. Just that you have ssh access to a server, and that git (client) is installed there too. You can combine this with also using a git server (as git repos can have multiple remotes).

The steps

  • Convert local folder into a bare repo
  • scp the bare repo to a (non-public) part of your server
  • Create the webhook in the bare repo on the server

On you local computer

Convert local folder into a bare repo

   git clone --bare project project.git

Converts normal folder project (that is already git-managed!), into a bare repository project.git.

A bare repo is basically only the .git folder part of a git-managed folder (it's insides if you like). You could in principle just copy this (inner) folder, but git's clone command has a bare option that does it for you. It's a good idea to name a bare repo .git to remind yourself that it's a bare git repo.

scp the bare repo to your server

Here assuming you have a folder called git in your remote home folder.

   scp -r project.git sshuser@myvps.org:git/

or if you have configured a host alias in your .ssh/config (in this case called "myvps").

   scp -r project.git myvps:git/

add the remote to your original repo

At this point you can delete the bare repo (it's now on the server). Let's add the ssh address of the repo on the server as the "myserver" remote. You can name the remote whatever you want including "origin" if you would like the remote server to use this, the default and most common remote name.

   cd project
   git add remote myserver remote:git/project.git
   git push --set-upstream myserver main 

On the remote server

ssh to your server

   ssh server

clone the bare repo to a (public) working directory on the server

   ssh server
   cd public_html
   git clone ~/git/project.git

create the webhook on the server

Now ssh to the server and edit a post-receive githook.

   cd ~/git/project.git

You can ls and see the "insides" of the repo:

   branches/  config  description  HEAD  hooks/  info/  objects/  packed-refs  refs/

Make sure there's not already a post-receive script...

   ls hooks

Ok, let's create one...

   nano git/project.git/hooks/post-receive
GIT_WORK_TREE=~/public_html/project git checkout -f⏎