Este tutorial no pretende explicar el funcionamiento del extraordinario sistema de control de versiones Git, sino su instalación y configuración en Windows en una configuración cliente-servidor con autenticación y privacidad. Si no se necesita autenticación ni privacidad, lo más sencillo es instalar cygwin con git en el servidor, arrancar git-daemon y usar el protocolo "git://" desde los clientes.
Para confeccionar este tutorial ha sido necesaria una intensa e infructuosa tarea de búsqueda de información (de ahí la necesidad de escribir el tutorial) y muchas horas de instalaciones configuraciones y pruebas: tanto GIT como los servidores SSH están muy bien documentados en sistemas Linux, no así en Windows. He realizado pruebas con distintos servidores SSH (freeSSHd, OpenSSH for Windows, mobassh, kpym telnet/ssh server y copSSH) y con las dos implementaciones de GIT (mediante cygwin y msysgit) para windows tanto en el cliente como en el servidor, y este tutorial pretende resumir la forma más sencilla de lograr una configuración cliente-servidor con autenticación y privacidad para trabajar con GIT.
Veremos paso a paso la instalación y configuración de GIT y un servidor SSH en un servidor que albergará los repositorios “centrales”. Después instalaremos GIT en el cliente y veremos los pasos a seguir para bajar un repositorio del servidor y cómo subir un nuevo repositorio al servidor.
También se da un esbozo de un workflow típico, para empezar a trabajar rápidamente.
------------------------
INSTALACIÓN DEL SERVIDOR
------------------------
En el servidor instalaremos copSSH y la implementación de GIT para windows msysgit. Es necesario instalar ambos en el mismo directorio.
1. Primero hay instalar copSSH en un directorio (p.e. C:\Archivos de programa\git-copssh)
Si se desea configurar un puerto de escucha diferente al puerto por defecto (22) se puede hacer en el parámetro Port del fichero etc/sshd_config. Supongamos que lo hemos configurado en el puerto 5678
2. Después hay que instalar Git para Windows (msysgit) en ese mismo directorio.
3. Los clientes se conectarán al servidor con una cuenta de usuario que hay que crear en el servidor y asociarla al servidor SSH.
4. Vamos a crear un usuario de tipo "Invitado" en el servidor que usaremos para la conexión SSH. Por ejemplo, gituser:
Panel de control / Cuentas de usuario / Crear una cuenta nueva => gituser
Hay que asociar una contraseña a la cuenta.
5. Añadir el usuario gituser al servidor SSH:
copSSH / Activate a User => gituser
Asignar una passphrase no vacía.
Esto creará dos ficheros con la clave pública y privada respectivamente, que habrá que distribuir a los clientes:
C:\Archivos de programa\git-copssh\home\gituser\gituser.key
C:\Archivos de programa\git-copssh\home\gituser\gituser.key.pub
---------------------------------
INSTALACIÓN INICIAL DE UN CLIENTE
---------------------------------
1. Instalamos cygwin seleccionando los siguientes paquetes: "git", "openssh" y "procps"
2. Vamos a preparar el ssh-agent en cygwin. Editamos el fichero c:\cygwin\cygwin.bat para dejarlo así :
@echo off
C:
chdir C:\cygwin\bin
set CYGWIN=ntsec binmode
c:\cygwin\bin\pkill ssh-agent
del c:\cygwin\etc\profile.d\ssh-agent.sh
c:\cygwin\bin\ssh-agent > c:\cygwin\etc\profile.d\ssh-agent.sh
bash --login -i
3. Iniciamos la sesión con cygwin
4. Configuramos, en el cliente, git a nivel global:
git config --global user.name "nombre_usuario"
git config --global user.email "tucuenta@tudominio.com"
git config --global core.autocrlf false
git config --global core.safecrlf false
5. Copiamos los ficheros gituser.key y gituser.key.put a c:\cygwin\home\USUARIO\.ssh
6. Desde la sesión cygwin cambiamos los permisos del fichero con la clave privada y lo añadimos al ssh-agent:
$ chmod 600 /home/USUARIO/.ssh/gituser.key
$ ssh-add /home/USUARIO/.ssh/gituser.key
Nos pide la passphrase y tenemos que introducir la que usamos para generar los ficheros con las claves.
7. Vamos a probar a conectarnos al servidor desde la sesión cygwin:
$ ssh -p 5678 gituser@192.168.0.1
como es la primera vez que nos conectamos al servidor por ssh, nos pide que confirmemos la firma del servidor. La confirmamos.
Comprobamos que entramos en el servidor y salimos:
$ ls -l
$ exit
--------------------------------
SUBIR UN PROYECTO AL REPOSITORIO
--------------------------------
1. Primero entramos en el servidor para crear el repositorio “central”, en 3 pasos:
- Creamos el directorio para el repositorio: C:\Archivos de programa\git-copssh\myproject
- Le damos al directorio permisos de "Control total" al usuario gituser.
- Creamos un repositorio vacío. Para ello, desde la línea de comandos nos situamos en el directorio recién creado y escribimos:
..\bin\git --bare init
2. Iniciamos la sesión con cygwin en el cliente donde tenemos el proyecto
3. Desde la sesión cygwin, para no tener que enviar la clave en cada operación contra el servidor, añadimos la clave privada al ssh-agent. Esto sólo hay que hacerlo una vez en cada sesión:
$ ssh-add /home/USUARIO/.ssh/gituser.key
4. Vamos a crear un repositorio local en el cliente sobre el proyecto y lo vamos a subir al servidor.
Desde la sesión cygwin entramos en el directorio de nuestro proyecto:
$ cd myproject
Inicializamos el repositorio local:
$ git init
Marcamos los ficheros y/o directorios que no queremos gestionar editando .\git\info\exclude , por ejemplo, para evitar lo directorios "bin" y "obj" :
*/bin/
*/obj/
Añadimos recursivamente todos los ficheros al repositorio local:
$ git add .
Echemos un vistazo a la interfaz de usuario:
$ git gui
Seguimos. Hacemos commit:
$ git commit -m "Version inicial"
Registramos el repositorio remoto en el repositorio local con el alias "origin":
$ git remote add origin ssh://gituser@192.168.0.1:5678/myproject
Subimos la rama "master" del repositorio local al repositorio remoto:
$ git push origin master
Ya podemos borrar el directorio y repositorio local:
$ cd ..
$ rm -fr myproject
9. Vamos a bajarnos el proyecto del repositorio público:
$ git clone ssh://gituser@192.168.0.1:5678/myproject
Ojo, porque ahora tenemos que volver a marcar los ficheros y/o directorios que no queremos gestionar editando .\git\info\exclude , ya que esas configuraciones no se trasladan hacia/desde el repositorio remoto. Por ejemplo, para evitar lo directorios "bin" y "obj" :
*/bin/
*/obj/
---------------------------------
BAJAR UN PROYECTO DEL REPOSITORIO
---------------------------------
1. Iniciamos la sesión con cygwin
2. Desde la sesión cygwin, para no tener que enviar la clave en cada operación contra el servidor, añadimos la clave privada al ssh-agent. Esto sólo hay que hacerlo una vez en cada sesión:
$ ssh-add /home/USUARIO/.ssh/gituser.key
3. Una vez situados en el directorio padre donde deseamos bajarnos el proyecto del repositorio público:
$ git clone ssh://gituser@192.168.0.1:5678/dinamiq
4. Tenemos que marcar los ficheros y/o directorios que no queremos gestionar con git editando .\git\info\exclude , por ejemplo, para evitar lo directorios "bin" y "obj":
*/bin/
*/obj/
5. Ya podemos trabajar, por ejemplo con este workflow:
En la rama "master" está lo último que nos hemos bajado del repositorio central.
Para trabajar en una nueva característica, creamos y hacemos checkuot de una nueva rama "new-feature".
Trabajamos en esa rama hasta que hemos terminado y probado los cambios.
Nos cambiamos a la rama "master" y nos bajamos lo último del repositorio central.
Nos volvemos a cambiar a la rama "new-feature" y la mezclamos con la "master", resolviendo los conflictos, si los hubiera.
Nos volvemos a cambiar a la "master" y la mezclamos con la "new-feature".
Subimos los cambios al repositorio central.
Podemos borrar la rama new-feature porque ya está incorporada a "master"
$ git checkout -b new-feature
algunos cambios
$ git commit -a
mas cambios
$ git commit -a
últimos cambios que dejan mi feature lista
$ git commit -a
$ git checkout master
$ git pull
$ git checkout new-feature
$ git rebase master
resolver conflictos si los hubiera
$ git checkout master
$ git merge new-feature
$ git push
$ git branch new-feature -d