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