Logo quidomi

De vez en cuando me da por practicar mi oxidado Java. Voy a hacer un pequeño programa para monitorizar los equipos de mi red casera utilizando Java y snmp. Me gusta guardar mis proyectos de desarrollo en mi servidor git privado (basado en gitea). En este apunte describo el proceso de creación de un repositorio git, un Proyecto Java con Eclipse y cómo los conecto entre sí. Si usas GitHub el proceso es idéntico, aunque visualmente las opciones cambien un poco respecto a gitea.


Encontrarás un par de apuntes sobre GIT en este blog, si quieres profundizar y entender git de verdad, te recomiendo GIT en detalle y la Chuleta sobre GIT. Si te interesa como montar Gitea en tu red casera, aquí y aquí también te dejo un par de apuntes.

Preparar SSH en tu ordenador

Antes de nada, con mi servidor gitea uso SSH para clonar los repositorios, así que es importante tenerlo bien configurado. Si usas GitHub te recomiendo hacer exáctamente lo mismo.

  • Ya lo tenía hecho, pero explico cómo creé mis claves público/privada. Nota: en mi caso las salvé con el nombre id_gitea
  • La contraseña que nos pide vamos a necesitarla más adelante al hacer el clonado y/o conexión con el servidor gitea.
    luis@idefix ~ $ ssh-keygen -t rsa -b 2048
    :
    
  • Se crearon dos ficheros, uno con la clave privada (id_gitea) y otro con la clave pública (id_gitea.pub), que es la que se puede compartir. Nunca compartas la privada.
    ➜  ~ ls -1  .ssh/id_gitea*
    .ssh/id_gitea      <== NO COMPARTIR NUNCA
    .ssh/id_gitea.pub  <== Compartible en github, gitea...
    
  • Por último, en mi usuario de gitea copio/pego el contenido del fichero id_gitea.pub como una clave nueva en el servidor gitea.
Doy de alta mi clave en gitea
Nota: Si quieres trabajar con ssh con github tiene que hacer lo mismo en github.com, añadir tu clave publica como una de las claves aceptadas para trabajar vía ssh, lo encontrarás en Logo de tu usuario > Settings > SSH and GPG keys


Preparar .gitconfig en tu ordenador.

  • Tanto si vas a hacer clonados desde la línea de comandos como desde aplicaciones (por ejemplo Eclipse), es conveniente que prepares el fichero .gitconfig en la raiz del carpeta del usuario. Al menos debería tener los campos name y email configurados
    $ cat $HOME/.gitconfig
    [user]
      name = Luis Palacios
      email = mi.correo.electrónico@dominio.com
    

Lo puedes hacer en Eclipse desde Preferences > Version control > Git > Configuration


Eclipse

Antes de nada, unos conceptos para entender mejor dónde se guardan los proyectos con Eclipse y qué cambia cuando usamos Git. Hay muchas maneras de organizar los proyectos y los flujos de trabajo, y Eclipse es lo suficientemente flexible a la hora de organizar o ubicar las cosas.

  • Workspace de Eclipse: Básicamente, un “Workspace” es una “colección de proyectos y configuraciones”. Al crearlo estamos creando una carpeta en el disco que contiene una única sub-carpeta llamada .metadata (almacena la configuración del workspace y la lista de proyectos vinculados). Es algo así como un puntero a una lista de proyectos.
  • Projecto Eclipse: Para poder realizar un programa es necesario crear un proyecto. Un Proyecto agrupa a un conjunto de recursos relacionados entre sí (código fuente, diagramas de clases, binario, documentación). Nota: con el plugin adecuado puedes crear proyectos en Ada, ABAP, C, C++, C#, Clojure, COBOL, D, Erlang, Fortran, Groovy, Haskell, JavaScript, Julia, Lasso, Lua, NATURAL, Perl, PHP, Prolog, Python, R, Ruby (Ruby on Rails), Rust, Scala, y Scheme.

Cuando usamos Git añadimos el tercer concepto:

  • Repositorio Git: Eclipse sabe mucho de Git (permite crear y clonar/conectar repositorios, permite incluso ejecutar cualquier comando git), pero repositorio Git no es un proyecto Eclipse en sí.
  • La forma de trabajar cuando queremos “git” es empezar por él, crear el repositorio en github (o gitlab o gitea), después clonarlo en mi ordenador y por último crear un Proyecto Eclipse y hacerlo dentro de dicho repositorio.


Preparar Eclipse para Git

  • Primero configuro GIT en Eclipse. Entro en sus Settings > Git. Aquí hay dos puntos importantes. El primero es indicar cual es la carpeta raíz a partir de la cual voy a dejar mis proyectos clonados desde el servidor git. El segundo es pedirle a Eclipse que salve las contraseñas que me vaya pidiendo.
Indico el carpeta raíz para mis proyectos en Gitea

Así que tenemos dos carpetas importantes:

  • El Workspace principal de Eclipse: /Users/luis/eclipse-workspace
  • La carpeta a partir de la cual tengo los repositorios Git (clones): /Users/luis/0_priv/prog/gitea-luispa/palas

Esta última es una carpeta cualquiera que dedicas en tu ordenador a tener tus proyectos de desarrollo, no tiene nada que ver con Eclipse. En mi caso siempre uso la misma independiente del IDE que emplee.


Proyecto Eclipse “dentro” de repositorio Git

Estos son los pasos, para meter un Proyecto Eclipse dentro de la carpeta de un Repositorio git.

  1. Creo un repositorio en el servidor (en mi caso gitea), que llamé quidomi.
  2. Abro o Clono el repositorio
    • /Users/luis/0_priv/prog/gitea-luispa/palas/quidomi
  3. Creo un Proyecto Eclipse en el workspace, que llamo QuiDomi.
    • /Users/luis/eclipse-workspace/QuiDomi
  4. Viculo ambos, el Proyecto Eclipse, con el Repositorio Git.


1. Crear el repositorio quidomi en gitea

Si ya tenemos el repositorio creado nos saltamos este paso. Creo el repositorio para mi pequeño proyecto en Java. Desde mi servidor gitea

Crear un nuevo repositorio

Defino los parámetros necesarios

Parámetros para la creación del repositorio

Una vez creado ya tengo acceso a la URL que usaremos más adelante para hacer el clonado.

Contenido del nuevo repositorio
  • Recuerdo la URL para poder hacer el clonado. Si selecciono SSH el usuario (la parte a la izquiera de la @) siempre debe ser git. No lo confundas con tu usuario en ese servidor (si es que tienes acceso). Cuando usamos SSH como método de sincronización desde git, el usuario es siempre git@...

git@git.tudominio.com:palas/quidomi.git


2. Clono o Abro el repositorio

  • Primero muestro la ventana de trabajo con GIT desde Window > Show View > Other > Git > Git Repositories.
Nota: Si ya tenía el respositorio clonado en mi ordenador mira al final de este punto

Desde la nueva ventana pulso en Clone a Git repository

Muestro la ventana de trabajo con repositorios
Pido clonar un repositorio
  • Pongo la URL de mi repositorio y dejo el resto de opciones sin cambiar.
Pego la URL del repositorio
  • Introduzco la contraseña que use al crear mis claves pública/privada SSH.
Contraseña que usé al crear mis ficheros de clave publica/privada
  • Este paso es opcional, decide qué hacer en tu caso
Opcional, crear una clave maestra
  • No cambio nada, me interesa descargar la rama principal (main)
Pulso en Next
  • No cambio nada, pero verifico que efectivamente va a crear un sub-carpeta en el sitio correcto. Recuerda que cambié mis preferencias para que todos los proyectos que clone desde un servidor git residan bajo .../palas
Compruebo el carpeta donde va a ser clonado y pulso en Finish
  • Ya tenemos nuestro proyecto, repositorio git, activo en el IDE de Eclipse.
A partir de ahora ya podemos trabajar en este proyecto compartido

En el caso de que ya hubiese tenido clonado el repositorio no habría necesitado hacer el clona, simplemente pulsando sobre Add an existing local Git repository y selecionandolo.

Abro un repositorio ya existente


3. Crear el Proyecto Eclipse QuiDomi.

A continuación creamos un Proyecto en Eclipse y lo llamamos igual que como se llama nuestro repositorio, pero de momento no tienen nada que ver, de hecho estarán desvinculados hasta el siguiente paso (4).

Crear nuevo proyecto
Asigno el nombre QuiDomi.
Asigno el nombre quiDomi (empieza en minúsculas) en el module-info
Nota: Este proyecto se va a ubicar en una sub-carpeta en el workspace. Cuando lo vinculemos al repositorio Git se moverá.
  • Ya puedes empezar a trabajar con tu Proyecto, pero se quedará todo en local, hasta que lo vincules / muevas debajo de la carpeta del repositorio Git local (clonado). En este ejemplo he creado un simple “Hola, mundo!”.
Creo un Package y una Clase


4. Vincular el Proyecto con el Repositorio Git.

En el Proyecto Eclipse QuiDomi, hago click con el botón derecho sobre QuiDomi en el Package Explorer y voy a “Team > Share Project”, selecciono el repositorio Git quidomi que vimos en los pasos 1 y 2. Lo que va a ocurrir es:

  • El Proyecto se “mueve” (la carpeta entera del proyecto) debajo de la carpeta del repositorio.
  • En el workspace seguimos teniendo el puntero al proyecto (aunque físicamente se ha movido su contenido)
  • A partir de este momento ya podemos trabajar desde Eclipse en “modo git” con este proyecto/programa, hacer commits, etc..
Selecciono Team > Share Project
Selecciono el Repositorio Git
  • Una vez que pulsas en Finish ocurren un par de cosas, la primera es que la carpeta del Proyecto, QuiDomi que estaba en el workspace, se mueve debajo de la carpeta del repositorio:
+----  /Users/luis/eclipse-workspace/QuiDomi
|
+----> /Users/luis/0_priv/prog/gitea-luispa/palas/quidomi/QuiDomi

➜  palas> ls -al quidomi
total 24
drwxr-xr-x@  7 luis  staff   224 29 nov 17:05 .
drwxr-xr-x@ 20 luis  staff   640 29 nov 17:05 ..
drwxr-xr-x@ 11 luis  staff   352 29 nov 16:46 .git
-rw-r--r--   1 luis  staff   303 29 nov 16:46 .gitignore
-rw-r--r--   1 luis  staff  1078 29 nov 16:46 LICENSE
drwxr-xr-x@  8 luis  staff   256 29 nov 17:05 QuiDomi      <=== !!!
-rw-r--r--   1 luis  staff   176 29 nov 16:46 README.md 

➜  palas> tree quidomi
quidomi
├── LICENSE
├── QuiDomi         <=== !!!
│   ├── bin
│   │   ├── QuiDomi
│   │   │   └── QuiDomi.class
│   │   └── module-info.class
│   └── src
│       ├── QuiDomi
│       │   └── QuiDomi.java
│       └── module-info.java
└── README.md

5 directories, 6 files

Lo segundo que ocurre es que empiezas a tener feedback visual. Observa cómo aparecen unas pequeñas “mochilas” indicativas en los iconos de las carpetas, son símbolos que nos indican el estado dentro del repositorio git

El Proyecto se vincula al Respositorio Git


Trabajar en el proyecto y hacer stage/commits/push

  1. Hacemos modificaciones, compilamos, verificamos que funciona
  2. Decidimos que queremos subir los cambios al servidor git.
  3. Iniciamos el proceso de commit
    • Primero paso las modificaciones al área de preparación (staging area) - en local
    • A continuación ejecuto el commit - seguimos en local
    • Por último hacemos un push - enviamos a remoto (servidor gitea).

Empiezo haciendo una modificación simple, compilando y comprobando…

Modificación y compiación de prueba

Decido iniciar el proceso de commit (mediante la opción Team > Commit)

Team > Commit (inicia el proceso)

Reviso los “Unstaged Changes”. Es decir, qué ficheros todavía no están en el area de intercambio (staging area).

Compruebo todos los Unstaged Changes

Solicito que se muevan esos ficheros a la Staging area

Stage de las modificaciones
Stage de las modificaciones

Escribo el mensaje de commit y pulso en Commit & Push.

Modifico el mensaje de commit y hago un `commit & push`
Valido el mensaje de confirmación

Compruebo en mi servidor gitea que se han recibido los cambios.

Los cambios se han recibido en el servidor gitea


Nomenclatura GIT

Os dejo aquí una pequeña chuleta sobre la nomenclatura git. Recuerda que tengo por aquí un par de apuntes más sobre GIT en detalle y la Chuleta sobre GIT.
Inglés Español Descripción
staging area área de preparación Es una zona intermedia (dentro de la sub-carpeta .git dentro de la carpeta del repositorio). Es el sitio donde se van preparando archivos a la espera del ser usados en el siguiente commit
index índice Es la lista de todos los archivos que se consideran ya preparandos a los que hacemos seguimiento y están en la staging área (entre tu working copy y el futuro commit).
working copy directorio de trabajo Es el directorio completo de tu proyecto, la parte no controlada por git, es decir, todos los ficheros y directorios que están fuera del subdirectorio .git
commit confirmar, comprometer Consiste en dar por bueno lo que tenemos en el Staging Area y pasarlo a un estado de “confirmado”, identificándolo con un puntero numérico (hash del commit). Junto con sus antepasados conforman una instantánea o versión de tu proyecto.
branch rama Es un nombre que actúa como puntero a un commit concreto dentro de tu repositorio .git
clone clonar, copiar Consiste en traerme a local un repositorio remoto completo, creando un duplicado del mismo para poder trabajar en él.
fetch traer Pedimos la última información de un remote, sin transferencia de archivos. Sirve para comprobar si hay algún cambio disponible.
merge fusión Comando que realiza una fusión a tres bandas entre las dos últimas instantáneas de cada branch y el ancestro común a ambas, creando un nuevo commit con los cambios mezclados
pull tirar Comando que para extraer y descargar contenido desde un repositorio remoto y actualizar al instante el repositorio local para reflejarlo. En realidad no es más que un git fetch segido de un git merge
push empujar Se usa para cargar contenido desde mi repositorio local hacia un repositorio remoto. El envío es la forma de transferir commits desde tu repositorio local a un repositorio remoto