Publicado 2023-03-19
Estuve usando por un buen tiempo git-daemon para manejar mis repositiorios de git en el servidor. Lo configuré de forma tal que sea por usuario, con los repositorios de cada uno en $HOME/public_git
. Te diría cómo, pero fue un dolor de huevos y además tenía cero seguridad, cualquiera con la url podía pushear. Probé con gitolite también, pero la configuración me resultó un laberinto de bosta interminable.
Alto boludo me sentí cuando me di cuenta que podía simplemente usar ssh para hacer todas las cosas que necesitaba. Inicializás repositorios bare donde te guste con git init --bare
y hacés clone, push, pull, etc. por ssh. Listo. Tipo:
$ git clone ramiro@covacha.net.ar:public_git/canvas-express.git
Si bien me queda más engorroso que lo de antes porque todo el path hasta canvas-express quedaba implicito con como había armado git-daemon, prefiero mucho más esto porque podés usar permisos de linux y se acabó el tema de la seguridad.
Para hacer que los repositorios sean verdaderamente públicos y que no requieran usuario, armé un usuario git
sin contraseña, sin home, sin más permisos que usar git. Lo hice así:
# adduser git --system --shell /usr/bin/git-shell --home /nonexistent
# echo git:U6aMy0wojraho | chpasswd -e
git-shell
, que viene con el paquete git, es un shell que solo permite opraciones git y nada más. Así limitás lo que puede hacer ese usuario público. Y eso de chpasswd
es una mágia negra para evitar que ssh pida contraseña (pasa aún con usuarios con contraseña deshabilitada).1
Ahora cualquiera puede clonar repositorios públicos haciendo:
$ git clone git@covacha.net.ar:/home/ramiro/public_git/canvas-express.git
Si por algún motivo te rebota el login, asegurate de tener PasswordAuthentication yes
y PermitEmptyPasswords yes
en tu configuración de ssh.
Si querés una interfáz web podés usar gitweb para apache. En el manual de gitweb, sección “Webserver configuration with multiple projects' root”, hay un buen ejemplo de configuración de apache para que gitweb te agarre todos los repositorios en $HOME/public_git
.
Para que los breadcrums funcionen tengo esto en /etc/gitweb.conf
:
my @root = split /\//, $ENV{'GITWEB_PROJECTROOT'};
our @extra_breadcrumbs = (
[ 'La covacha' => 'http://covacha.net.ar/' ],
[ $root[2] => 'http://covacha.net.ar/~' . $root[2] ],
);
En ese mismo archivo podés configurar un montonazo de cosas: grep, blame, snapshots. Todo explicado en el manual.
Para que aparezca un README en los proyectos armé uno hook que agarran el README y lo pasan de markdown a html.
Instalá discount
para tener markdown
y en ~/.git_template/hooks/post-receive
poné:
#!/bin/sh
git cat-file blob HEAD:README | markdown > ./README.html
y ponele a la env var $GIT_TEMPLATE_DIR
~/.git_template
para que se copie ese hook cada vez que hagas git init
.
Ahora con cada push que le hagas al servidor se va a generar README.html a aprtir de README (si existe), que es el archivo que busca gitweb para mostrar.
Ya no uso más gitweb. Tengo mi setup explicado otro post.
http://covacha.net.ar/~ramiro/blog/config_webserver.md
© 2020-2025 Ramiro. Contenido disponible bajo CC BY-SA 4.0.
U6aMy0wojraho
vedría a ser el hash de la contraseña “vacía” que se usa para usuarios “invitado”, que no piden contraseña para ingresar. No es una cosa estandarizada, pero al ménos en Debian funciona.↩