Un tema recurrente en Git es configurar un repositorio remoto para trabajo en grupo. Crear un grupo git y asignar cada usuario al grupo no basta, ya que encontraremos problemas de permisos. Setear un umask global de 0002 tampoco sirve, porque le baja mucho la seguridad al servidor.
Una posible solucion es compartir un usuario global para los commits (push), por ejemplo usuario git. De todas maneras, el mensaje de log de git con el nombre de usuario se crea en la maquina cliente segun la configuracion local de cada usuario, asi que cada usuario queda registrado en los logs con su nombre. Para evitar compartir una clave SSH global con todos los usuario, se pueden generar par de claves SSH para cada usuario, y agregarlas al archivo /home/git/.ssh/authorized_keys
Por ultimo, si no queremos que los usuarios puedan usar el shell remoto con el usuario git, configuramos como shell default “/usr/bin/git-shell” para el usuario git. De esta forma los usuarios no podran usar el shell ssh, pero todavia podran usar el protocolo ssh para enviar los cambios al servidor.
Veamos el proceso paso a paso con un ejemplo.
LOCAL MACHINE
El usuario genera un par de claves ssh
ssh-keygen -t rsa -C "user@email.com" -f ~/.ssh/dev_git_remotehost_id_rsa
Copiar la parte publica de la clave al servidor Git
scp ~/.ssh/dev_git_remotehost_id_rsa.pub user@remotehost:~/
REMOTE MACHINE
TODO: ejemplo Crear usuario Git
Agregar la clave publica anteriormente creada en el archivo authorized_keys del usuario git. Eso permitira al usuario loguearse via ssh como usuario git.
$ sudo cat dev_git_remotehost_id_rsa.put » /home/git/.ssh/authorized_keys $ sudo chmod 0600 /home/git/.ssh/authorized_key $ sudo chmod 0700 /home/git/.ssh/
$ sudo chown git:git -R /home/git/
Asegurarse que solo el usuario tiene permiso en su directorio, de lo contrario no aceptara public key como forma de login, y fallara silenciosamente.
$ sudo chmod 0700 /home/git/ $ sudo chmod g-s /home/git/ $ ls -lhd /home/git/ drwx------ 5 git git 4.0K Oct 10 21:36 /home/git/ $ ssh -v git@localhost
Repetir el proceso para cada usuario, agregando la clave publica de cada usuario al final del archivo authorized_keys.
LOCAL MACHINE
Add following lines to ~/.ssh/config ————————————————
Host myrepogit Hostname remotehost.com User git IdentityFile ~/.ssh/dev_git_remotehost_id_rsa IdentitiesOnly yes
———————————————— Notar que myrepogit es un alias que apunta a remotehost.com Se puede usar cualquier nombre para el alias.
And login with the shortcut hostname:
ssh -v myrepogit git remote add myrepogit ssh://myrepogit/home/git/repo.git
Para clonar el repositorio, usamos el ssh alias myrepogit:
git clone ssh://myrepogit/home/git/repo.git
Para enviar cambios al repositorio, tambien usamos el alias:
git push myrepogit master:master
Para simplificar, tambien podemos configurar el repositorio como default (origin)
cat .git/config
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [branch "master"] remote = origin merge = refs/heads/master [remote "origin"] url = ssh://myrepogit/home/git/repo.git fetch = +refs/heads/*:refs/remotes/myrepogit/*
Eso nos permitira escribir menos:
git pull
git push